1 Introduction

A comparison of JULES-ES-1p0 wave01 members against the original ensemble (wave00).

Wave 01 input parameter sets were picked using History matching to fall within Andy Wiltshire’s basic constraints on NBP, NPP, cSoil and cVeg stocks at the end of the 20th century. We use 300 of the 500 members, keeping back 2/5ths for emulator validation later.

We answer some basic questions.

What proportion of the new ensemble match AW’s constraints?

What do the timeseries of carbon cycle properties look like with and without AW’s constraints?

How good is a GP emulator? Does it get better overall with the new ensemble members added? In particular, does it get better for those members within the AW constraints?

Does comparison of the ensemble with Atmospheric growth observations give more of a constraint?

To do:

Does the sensitivity analysis change?

2 Preliminaries

Load libraries, functions and data.

2.1 How many run failures were there?

There are no NAs but some relative humidity values are infinite. There are no “low NPP” ensemble members

[1] 117464.6
[1] FALSE
     row col
[1,] 140   9
[2,] 232   9
[3,] 249   9
[4,] 300   9
[1] Inf Inf Inf Inf
[1] "rh_lnd_sum"

2.2 Wave00 level1a Ensemble behaviour in all outputs

Need units

2.3 Wave00/Wave01 Ensemble behaviour in key (constraining) outputs.

Global mean for the 20 years at the end of the 20th Century. There is still a significant low bias on cVeg output.

2.4 What proportion of models now fall within Andy’s constraints?

Just over a third! Better than before, but still not great. Pointing at a significant model discrepency in cVeg

Of the 400 members of the wave01 ensemble, 128 pass Andy Wiltshire’s Level 2 constraints.

[1] 128

Pairs plot of the inputs that pass the constraints with respect to the limits of the original ensemble.

2.5 Timeseries of mean carbon cycle properties over whole run.

2.6 timeseries outliers

Timeseries that have problems. NBP, RH and cSoil seems to have large outliers

[1]  78  31 243 249 300

This is a plot of timeseries of Wave00, Wave01, and level2-constrained wave01 on top of one another. We see that the wave01 is closer to the standard than wave00, and the level-2 constrained wave01 ensemble is often closer again. However, there are still quite large discrepancies. For example, baresoilfrac is often way too high, shrubfrac is often too low (though both these span the standard). Treefrac is away from zero, but still often too low or too high. While fHarvest looks good, fLuc does not appear constrained by the process at all. RH (soil respiration) looks well constrained, whereas lai is often too low.

One thing we could do next is constrain input space again, using observations or “tolerance to error” on some or all of these outputs.

We could also extend sensitivity analysis to work out what controls e.g. treefrac.

A summary of what gets constrained when you constrain the top-level variables would be a useful aanalysis.

2.7 Anomaly timeseries

Similar to above, but output anomaly

3 Emulator fits

We hope that running the new ensemble gives us a better emulator, and allows us to rule out more input space. We particularly hope that the emulator is better for those members that are inside AW’s constraints.

First, we can look at the emulator errors in two cases: The level1a data (a basic carbon cycle), and then with the Wave01 data, which should have similar characteristics. (We should have eliminated really bad simulations, but wave01 is not constrained the data perfectly to be within AW constraints.)

Found the outlier - looks like it’s 440

integer(0)

3.1 Leave-one-out analyses of emulator prediction accuracy

The top row shows the leave-one-out prediction accuracy of the original wave00 ensemble, and the lower row the entire wave00 AND wave01 ensemble combined.

3.2 Emulator accuracy of members from wave 00 and wave 01 that pass level 2 (AW’s) constraints

We see that the error stats for some of the outputs from wave01 are worse, but there are many more ensemble members that lie within the constraints for wave 01.

“pmae” is “proportional mean absolue error”, which is the mean absolute error expressed as a percentage of the original (minimally constrained) ensemble range in that output.

3.3 Does the emulator improve is you look at only the 37 members that pass level 2 constraints in wave 00?

This gives us an idea of how good the emulator is where it really matters, and as the members are consistent, gives us a fairer idea of whether the emulators have improved with more members.

Good news is, the emulators are more accurate for wave01.

These leave-one-out prediction accuracy plots rank the ensemble members from largest underprediction to largest overprediction using the wave00 predictions. A perfect prediction would appear on the horizontal “zero” line.

Many of the wave01 predictions are closer to the horizontal line, and therefore more accurate predictions.

None of the predictions are outside the uncertainty bounds, which suggests they are overconservative (should be smaller).

Looking at the proportional mean absolute error (pmae), expressed in percent, we can see that it doesn’t improve much for the whole ensemble, but does improve significantly for the subset of ensemble members that fall within AW’s constraints from the first ensemble (marked "_sub").


pmae_wave00 <- lapply(loostats_km_Y_level1a, FUN = function(x) x$pmae )
pmae_wave01 <- lapply(loostats_km_Y_level1a_wave01, FUN = function(x) x$pmae )

pmae_wave00_sub <- lapply(loostats_km_Y_level1a_sub, FUN = function(x) x$pmae )
pmae_wave01_sub <- lapply(loostats_km_Y_level1a_wave01_sub, FUN = function(x) x$pmae )

pmae_table <- cbind(pmae_wave00, pmae_wave01, pmae_wave00_sub, pmae_wave01_sub)

print(pmae_table)
     pmae_wave00 pmae_wave01 pmae_wave00_sub pmae_wave01_sub
[1,] 5.028607    4.925435    7.616212        4.29043        
[2,] 4.229925    3.839262    4.757699        3.803734       
[3,] 3.612721    3.61296     4.695979        3.638436       
[4,] 4.225348    4.445844    4.726056        3.679415       

4 Comparing atmospheric growth in wave00, wave01 and observations

4.1 Andy asks - what constraint does that give us in cumulative NBP?

4.2 Eddy suggests measuring cumulative NBP against atmospheric growth rate

Calculate the atmospheric growth rate of 1984- 2013 using a simple linear fit

[1] "correlation agr vs cnbp (all members)" "-0.0410843006467242"                  
[1] "correlation agr vs cnbp (wave01)" "0.00250625692520855"             

Call:
lm(formula = agr_modern_ens ~ cnbp_modern_ens)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.047201 -0.003654  0.003930  0.006844  0.023340 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      1.112e-01  5.219e-04 213.034   <2e-16 ***
cnbp_modern_ens -1.404e-09  1.532e-09  -0.917     0.36    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01165 on 497 degrees of freedom
Multiple R-squared:  0.001688,  Adjusted R-squared:  -0.0003208 
F-statistic: 0.8403 on 1 and 497 DF,  p-value: 0.3598


Call:
lm(formula = agr_modern_wave01 ~ cnbp_modern_wave01)

Residuals:
    Min      1Q  Median      3Q     Max 
  -3476   -3476   -3476   -3476 1383498 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)        3.476e+03  3.476e+03    1.00    0.318
cnbp_modern_wave01 4.103e-29  8.205e-28    0.05    0.960

Residual standard error: 69440 on 398 degrees of freedom
Multiple R-squared:  6.281e-06, Adjusted R-squared:  -0.002506 
F-statistic: 0.0025 on 1 and 398 DF,  p-value: 0.9601

Interannual variability and cumulative NBP

(correlations are close to zero, especially in the later wave)

[1] 0.03248668
[1] 0.002506268

4.3 How close can we get the model to reality?

Using Atmospheric Growth Rate as an example, how close can we get the model to observations? Can we do better than standard? What are the trade offs of doing so? How does getting close in AGR affect performance in other outputs?

We’ve established that most of the original ensemble have an ME/MAE/RMSE larger than the standard run. More (but few) of the wave01 perform better than standard.

A map of the 2D projections of parameter space where the ensemble member performs better than standard.

The blue part is the first wave, and not subject to constraint so may be removed in the second wave (wave01).

4.4 Build emulators and find parts of parameter space that to better than standard at atmospheric growth.

Having trouble fitting RMSE, to trying mean error.

Why is there an odd collection at just under 1?

[1] 128

This next pairs plot looks at all the ensemble members that have a better mean atmospheric growth error than standard.

This next plot looks at all the ensemble members that have a better mean atmospheric growth error than standard AND pass the level 2 constraints.

The number is small (41/300), but the ensemble members seem spread across parameter space.

[1] 21.573

4.5 Input space with low Atmospheric Growth Error

This pairs plot shows the 2d and marginal density of emulated input points where the emulated atmospheric growth is closer to the observations than the standard model.

This technique might provide a useful set of points for optimising the model (at least to atmospheric growth).

Next, check emulators of all the other outputs and apply the constraints to them. See how the constraints change.

4.6 Input space with emulated members passing Level 2 constraints.

[1] 13.245

4.7 Input space with emulated members passing Level 2 constraints AND low atmospheric growth error

Emulated members passing level2 constraints AND having lower error in atmospheric growth than standard.

Red point indicates the standard input.

The position of the standard input with regards to the histograms give us an idea of what we might do to improve the simulation - at least in terms of atmospheric growth. If we were to move the input towards areas of higher density, we might expect a better model performance.

[1] 5.762

5 Exploring further constraints

It’s pretty clear that the “initial” (level2) constraints can be improved on. How about tree, shrub and bare soil fractions?

Build an ensemble of modern vegetation fractions.

5.1 Leave-one-out analyses of emulator prediction accuracy

LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgSlVMRVMxcDAgZW5zZW1ibGUgd2F2ZTAxIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdG9jX2RlcHRoOiAzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwotLS0KCiMgSW50cm9kdWN0aW9uCgpBIGNvbXBhcmlzb24gb2YgSlVMRVMtRVMtMXAwIHdhdmUwMSBtZW1iZXJzIGFnYWluc3QgdGhlIG9yaWdpbmFsIGVuc2VtYmxlICh3YXZlMDApLgoKV2F2ZSAwMSBpbnB1dCBwYXJhbWV0ZXIgc2V0cyB3ZXJlIHBpY2tlZCB1c2luZyBIaXN0b3J5IG1hdGNoaW5nIHRvIGZhbGwgd2l0aGluIEFuZHkgV2lsdHNoaXJlJ3MgYmFzaWMgY29uc3RyYWludHMgb24gTkJQLCBOUFAsIGNTb2lsIGFuZCBjVmVnIHN0b2NrcyBhdCB0aGUgZW5kIG9mIHRoZSAyMHRoIGNlbnR1cnkuIFdlIHVzZSAzMDAgb2YgdGhlIDUwMCBtZW1iZXJzLCBrZWVwaW5nIGJhY2sgMi81dGhzIGZvciBlbXVsYXRvciB2YWxpZGF0aW9uIGxhdGVyLgoKV2UgYW5zd2VyIHNvbWUgYmFzaWMgcXVlc3Rpb25zLgoKV2hhdCBwcm9wb3J0aW9uIG9mIHRoZSBuZXcgZW5zZW1ibGUgbWF0Y2ggQVcncyBjb25zdHJhaW50cz8KCldoYXQgZG8gdGhlIHRpbWVzZXJpZXMgb2YgY2FyYm9uIGN5Y2xlIHByb3BlcnRpZXMgbG9vayBsaWtlIHdpdGggYW5kIHdpdGhvdXQgQVcncyBjb25zdHJhaW50cz8KCkhvdyBnb29kIGlzIGEgR1AgZW11bGF0b3I/IERvZXMgaXQgZ2V0IGJldHRlciBvdmVyYWxsIHdpdGggdGhlIG5ldyBlbnNlbWJsZSBtZW1iZXJzIGFkZGVkPyBJbiBwYXJ0aWN1bGFyLCBkb2VzIGl0IGdldCBiZXR0ZXIgZm9yIHRob3NlIG1lbWJlcnMgd2l0aGluIHRoZSBBVyBjb25zdHJhaW50cz8KCkRvZXMgY29tcGFyaXNvbiBvZiB0aGUgZW5zZW1ibGUgd2l0aCBBdG1vc3BoZXJpYyBncm93dGggb2JzZXJ2YXRpb25zIGdpdmUgbW9yZSBvZiBhIGNvbnN0cmFpbnQ/CgpUbyBkbzoKCkRvZXMgdGhlIHNlbnNpdGl2aXR5IGFuYWx5c2lzIGNoYW5nZT8KCiMgUHJlbGltaW5hcmllcwpMb2FkIGxpYnJhcmllcywgZnVuY3Rpb25zIGFuZCBkYXRhLgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzID0gJ2hpZGUnfQojIExvYWQgaGVscGVyIGZ1bmN0aW9ucwoKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5wYXRoID0gImZpZ3MvIiwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmdzID0gRkFMU0UpCgojIGxvYWQgaGVscGVyIGZ1bmN0aW9ucywgZGF0YSBhbmQgZG8gcHJlbGltaW5hcnkgcHJvY2Vzc2luZyBvZiB0aGUgZW5zZW1ibGUuCnNvdXJjZSgnSlVMRVMtRVMtMXAwLWNvbW1vbi5SJykKCmBgYAoKYGBge3J9CgojZW5zbG9jX3dhdmUwMSA8LSAnL3NjcmF0Y2gvaGFkYXcvanVsZXNfcG9zdHByb2Nlc3MvdS1jazAwNi8nCmVuc2xvY193YXZlMDEgPC0gJy9kYXRhL3VzZXJzL2hhZGF3L0pVTEVTX0VTX1BQRS91LWNrMDA2LycKCiMgTnVtYmVyIG9mIGVuc2VtYmxlIG1lbWJlcnMgKG91dCBvZiA1MDApIHRvIHVzZSBmb3IgdHJhaW5pbmcgaW4gd2F2ZTAxCm50cmFpbl93YXZlMDEgPC0gNDAwCgpgYGAKCgpgYGB7cn0KCm1ha2VKdWxlc0Vuc2VtYmxlTW9kZXJuVmFsdWUgPC0gZnVuY3Rpb24oZW5zbG9jLCB2YXJsaXN0LCBuc3RhcnQsIG5lbmQsIGl4ID0gMTQ0OjE2NCl7CgogIG5lbnMgPC0gKG5lbmQgLSBuc3RhcnQpICsgMQogIGRhdG1hdCA8LSBtYXRyaXgobnJvdyA9IG5lbnMsIG5jb2wgPSBsZW5ndGgodmFybGlzdCkpCiAgY29sbmFtZXMoZGF0bWF0KSA8LSB2YXJsaXN0CgogIGVuc2xpc3QgPC0gcGFzdGUoIlAiLCBmb3JtYXRDKG5zdGFydDpuZW5kLCB3aWR0aD00LCBmbGFnPSIwIiksIHNlcD0iIikKCiAgZm9yKGkgaW4gMTpuZW5zKXsKCiAgICB2ZWMgPC0gcmVwKE5BLCBsZW5ndGgodmFybGlzdCkpCgogICAgZW5zbWVtYmVyIDwtIGVuc2xpc3RbaV0KCiAgICBmbiA8LSBwYXN0ZTAoZW5zbG9jLCdKVUxFUy1FUy0xcDBfJyxlbnNtZW1iZXIsJ19Bbm51YWxfZ2xvYmFsLm5jJykKCiAgICB0cnkobmMgPC0gbmNfb3BlbihwYXN0ZTAoZm4pKSkKICAgIHRyeSh2ZWMgPC0gc2FwcGx5KHZhcmxpc3QsIEZVTiA9IG1vZGVyblZhbHVlLCBuYyA9IG5jLCBpeCA9IGl4KSkKICAgIGRhdG1hdFtpLCBdIDwtIHZlYwogICAgbmNfY2xvc2UobmMpCiAgfQogIHJldHVybihsaXN0KGRhdG1hdCA9IGRhdG1hdCwgZW5zbGlzdCA9IGVuc2xpc3QpKQp9CgoKIyBtYWtlSnVsZXNFbnNlbWJsZU1vZGVyblZhbHVlIDwtIGZ1bmN0aW9uKGVuc2xvYywgdmFybGlzdCwgbnN0YXJ0LCBuZW5kLCBpeCA9IDE0NDoxNjQpewojICAgCiMgICBuZW5zIDwtIChuZW5kIC0gbnN0YXJ0KSArIDEKIyAgIGRhdG1hdCA8LSBtYXRyaXgobnJvdyA9IG5lbnMsIG5jb2wgPSBsZW5ndGgodmFybGlzdCkpCiMgICBjb2xuYW1lcyhkYXRtYXQpIDwtIHZhcmxpc3QKIyAgIAojICAgZW5zbGlzdCA8LSBwYXN0ZSgiUCIsIGZvcm1hdEMobnN0YXJ0Om5lbmQsIHdpZHRoPTQsIGZsYWc9IjAiKSwgc2VwPSIiKQojICAgCiMgICBmb3IoaSBpbiAxOm5lbnMpewojICAgICAKIyAgICAgdmVjIDwtIHJlcChOQSwgbGVuZ3RoKHZhcmxpc3QpKQojICAgICAKIyAgICAgZW5zbWVtYmVyIDwtIGVuc2xpc3RbaV0gCiMgICAgIAojICAgICBmbiA8LSBwYXN0ZTAoZW5zbG9jLGVuc21lbWJlciwnL3N0YXRzLycsJ0pVTEVTLUVTLTFwMF8nLGVuc21lbWJlciwnX0FubnVhbF9nbG9iYWwubmMnKQojICAgICAKIyAgICAgdHJ5KG5jIDwtIG5jX29wZW4ocGFzdGUwKGZuKSkpCiMgICAgIHRyeSh2ZWMgPC0gc2FwcGx5KHZhcmxpc3QsIEZVTiA9IG1vZGVyblZhbHVlLCBuYyA9IG5jLCBpeCA9IGl4KSkKIyAgICAgZGF0bWF0W2ksIF0gPC0gdmVjCiMgICAgIG5jX2Nsb3NlKG5jKQojICAgfQojICAgcmV0dXJuKGxpc3QoZGF0bWF0ID0gZGF0bWF0LCBlbnNsaXN0ID0gZW5zbGlzdCkpCiMgfQoKCgpgYGAKCgpgYGB7cn0KbnN0YXJ0IDwtIDQ5OQpuZW5kIDwtIChuc3RhcnQgKyBudHJhaW5fd2F2ZTAxKSAtIDEKCmlmIChmaWxlLmV4aXN0cygiZW5zZW1ibGVfd2F2ZTAxXzIwMjItMDQtMDgucmRhdGEiKSkgewogIGxvYWQoImVuc2VtYmxlX3dhdmUwMV8yMDIyLTA0LTA4LnJkYXRhIikKfSBlbHNlIHsKICAKZW5zX3dhdmUwMV9tdiA8LSBtYWtlSnVsZXNFbnNlbWJsZU1vZGVyblZhbHVlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFybGlzdCA9IHlfbmFtZXNfc3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gbnN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVuZCA9IG5lbmQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXggPSAxNDQ6MTY0KSAKICAKICBzYXZlKGVuc193YXZlMDFfbXYsIGZpbGUgPSJlbnNlbWJsZV93YXZlMDFfMjAyMi0wNC0wOC5yZGF0YSIpCn0KICAKYGBgCgpgYGB7cn0KCmxoc193YXZlMDEgPC0gcmVhZC50YWJsZSggJy4uL2NvbmZfZmlsZXNfYXVnbWVudF9KVUxFUy1FUy0xcDAvbGhzX2V4YW1wbGUudHh0JywgaGVhZGVyID0gVFJVRSkKClhfd2F2ZTAxID0gbm9ybWFsaXplKGxoc193YXZlMDEsIHdydCA9IHJiaW5kKGxoc19pLCBsaHNfaWksIGxoc193YXZlMDEpKQpjb2xuYW1lcyhYX3dhdmUwMSkgPSBjb2xuYW1lcyhsaHNfd2F2ZTAxKQoKIyBNYXRjaCB0aGUgMzAwIG91dHB1dHMgd2UncmUgdXNpbmcgaW4gdGhlIHRyYWluaW5nIGRhdGEKWF93YXZlMDFfdHJhaW4gPC0gWF93YXZlMDFbMTpudHJhaW5fd2F2ZTAxLCBdCgpgYGAKCmBgYHtyfQpZX2NvbnN0X3dhdmUwMSA8LSBlbnNfd2F2ZTAxX212JGRhdG1hdFssIHluYW1lc19jb25zdF0KCllfY29uc3Rfd2F2ZTAxX3NjYWxlZCA8LSBzd2VlcChZX2NvbnN0X3dhdmUwMSwgMiwgU1RBVFMgPSBzY2FsZXZlYywgRlVOID0gJy8nICkKCgpgYGAKCiMjIEhvdyBtYW55IHJ1biBmYWlsdXJlcyB3ZXJlIHRoZXJlPyAgCgpUaGVyZSBhcmUgbm8gTkFzIGJ1dCBzb21lIHJlbGF0aXZlIGh1bWlkaXR5IHZhbHVlcyBhcmUgaW5maW5pdGUuClRoZXJlIGFyZSBubyAibG93IE5QUCIgZW5zZW1ibGUgbWVtYmVycwoKYGBge3J9Cgpsb3dfbnBwX2l4X3dhdmUwMSA8LSB3aGljaChlbnNfd2F2ZTAxX212JGRhdG1hdFssJ25wcF9ubGltX2xuZF9zdW0nXSA8IDFlNSkKCm1pbihlbnNfd2F2ZTAxX212JGRhdG1hdFssJ25wcF9ubGltX2xuZF9zdW0nXSkKCllfd2F2ZTAxX25sZXZlbDBfaXggPC0gd2hpY2goaXMubmEoZW5zX3dhdmUwMV9tdiRkYXRtYXRbLCduYnBfbG5kX3N1bSddKSkKCmFsbChpcy5maW5pdGUoZW5zX3dhdmUwMV9tdiRkYXRtYXQpKQoKd2hpY2goIWlzLmZpbml0ZShlbnNfd2F2ZTAxX212JGRhdG1hdCksIGFyci5pbmQgPSBUUlVFKQoKZW5zX3dhdmUwMV9tdiRkYXRtYXRbd2hpY2goIWlzLmZpbml0ZShlbnNfd2F2ZTAxX212JGRhdG1hdCksIGFyci5pbmQgPSBUUlVFKV0KCmNvbG5hbWVzKGVuc193YXZlMDFfbXYkZGF0bWF0KVs5XQoKCmBgYAoKCgojIyBXYXZlMDAgbGV2ZWwxYSBFbnNlbWJsZSBiZWhhdmlvdXIgaW4gYWxsIG91dHB1dHMKCgoKTmVlZCB1bml0cwoKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0ID0gMTB9CgoKI3BkZihmaWxlID0gJ2ZpZ3Mvd2F2ZTAwLWxldmVsMWEtbW9kZXJuLXZhbHVlLWhpc3RzLnBkZicsIHdpZHRoID0gOCwgaGVpZ2h0ID0gMTApCnBhcihtZnJvdyA9IGMoNSwzKSwgZmcgPSAnZGFya2dyZXknLCBsYXMgPSAxKQpmb3IgKGkgaW4geV9uYW1lc19zZWxlY3QpewogIAogIAogIGhpc3QoWV9sZXZlbDFhWywgaV0sIG1haW4gPSBpLCBjb2wgPSAnZ3JleScsIHhsYWIgPSBzZWxlY3RfdW5pdHNbaV0pCiAgYWJsaW5lKHYgPSBzdGFuZGFyZF9tb2Rlcm5fdmFsdWVbaV0sIGNvbCA9ICdibGFjaycpCiAgCn0KI2Rldi5vZmYoKQoKCgpgYGAKCgoKIyMgV2F2ZTAwL1dhdmUwMSAgRW5zZW1ibGUgYmVoYXZpb3VyIGluIGtleSAoY29uc3RyYWluaW5nKSBvdXRwdXRzLiAKCkdsb2JhbCBtZWFuIGZvciB0aGUgMjAgeWVhcnMgYXQgdGhlIGVuZCBvZiB0aGUgMjB0aCBDZW50dXJ5LiBUaGVyZSBpcyBzdGlsbCBhIHNpZ25pZmljYW50IGxvdyBiaWFzIG9uIGNWZWcgb3V0cHV0LgoKYGBge3IsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA4fQoKd2F2ZTAwY29sIDwtICdza3libHVlMicKd2F2ZTAxY29sIDwtICd0b21hdG8yJwoKd2F2ZTAwY29sIDwtICdkb2RnZXJibHVlMicKd2F2ZTAxY29sIDwtICdmaXJlYnJpY2snCnJhbmdlY29sIDwtICdncmV5JwoKCiMgSGlzdG9ncmFtIG9mIGxldmVsIDEgY29uc3RyYWludHMKaGNvbCA9ICdkYXJrZ3JleScKbGNvbCA9ICdibGFjaycKCiNwZGYoZmlsZSA9ICdmaWdzL2xldmVsXzJfY29uc3RyYWludHNfaGlzdHMucGRmJywgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpwYXIobWZyb3cgPSBjKDIsMiksIGZnID0gJ2RhcmtncmV5JywgbGFzID0gMSwgb21hID0gYygwLjEsIDAuMSwgNCwgMC4xKSkKCnRydW5jIDwtIGZ1bmN0aW9uKHgsIHZlYyl7CiAgCiAgZGF0IDwtIHhbeCA8IG1heCh2ZWMpICYgeCA+IG1pbih2ZWMpICBdCiAgCiAgZGF0CiAgCn0KCgpoIDwtIGhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ25icF9sbmRfc3VtJ10sIG1haW4gPSAnTkJQJywgeGxhYiA9ICdHdEMveWVhcicsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsMTUwKSkKaGlzdCh0cnVuYyhZX2NvbnN0X3dhdmUwMV9zY2FsZWQgWywnbmJwX2xuZF9zdW0nXSwgaCRicmVha3MpICwKICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLDE1MCkgLCBicmVha3MgPSBoJGJyZWFrcywgYWRkID0gVFJVRSkKCnJ1ZyhZX2NvbnN0X3N0YW5fc2NhbGVkWyduYnBfbG5kX3N1bSddLCBsd2QgPSAyKQoKcG9seWdvbih4ID0gYygwLCAxMDAsIDEwMCwgMCksIHkgPSBjKDAsIDAsIDEwMDAsIDEwMDApLAogICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCwgNjApLAogICAgICAgIGJvcmRlciA9IG1ha2VUcmFuc3BhcmVudChyYW5nZWNvbCkpCgpoIDwtIGhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ25wcF9ubGltX2xuZF9zdW0nXSxjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLDE1MCksIG1haW4gPSAnTlBQJywgeGxhYiA9ICdHdEMveWVhcicpCmhpc3QodHJ1bmMoWV9jb25zdF93YXZlMDFfc2NhbGVkIFssJ25wcF9ubGltX2xuZF9zdW0nXSwgaCRicmVha3MpICwgCiAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCkgLCBicmVha3MgPSBoJGJyZWFrcywgYWRkID0gVFJVRSkKCnJ1ZyhZX2NvbnN0X3N0YW5fc2NhbGVkWyducHBfbmxpbV9sbmRfc3VtJ10sIGx3ZCA9IDIpCgpwb2x5Z29uKHggPSBjKDM1LCA4MCwgODAsIDM1KSwgeSA9IGMoMCwgMCwgMTAwMCwgMTAwMCksCiAgICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sLCA2MCksCiAgICAgICAgYm9yZGVyID0gbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sKSkKCgpoIDwtIGhpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NTb2lsX2xuZF9zdW0nXSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwxNTApLCBtYWluID0gJ1NvaWwgQ2FyYm9uJywgeGxhYiA9ICdHdEMnKQpoaXN0KHRydW5jKFlfY29uc3Rfd2F2ZTAxX3NjYWxlZCBbLCdjU29pbF9sbmRfc3VtJ10sIGgkYnJlYWtzKSAsIAogICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsMTUwKSAsIGJyZWFrcyA9IGgkYnJlYWtzLCBhZGQgPSBUUlVFKQoKcnVnKFlfY29uc3Rfc3Rhbl9zY2FsZWRbJ2NTb2lsX2xuZF9zdW0nXSwgbHdkID0gMikKCnBvbHlnb24oeCA9IGMoNzUwLCAzMDAwLCAzMDAwLCA3NTApLCB5ID0gYygwLCAwLCAxMDAwLCAxMDAwKSwKICAgICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wsIDYwKSwKICAgICAgICBib3JkZXIgPSBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wpKQoKaCA8LSBoaXN0KFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwxNTApLCBtYWluID0gJ1ZlZ2V0YXRpb24gQ2FyYm9uJywgeGxhYiA9ICdHdEMnKQpoaXN0KHRydW5jKFlfY29uc3Rfd2F2ZTAxX3NjYWxlZCBbLCdjVmVnX2xuZF9zdW0nXSwgaCRicmVha3MpICwgCiAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsMTUwKSAgLCBicmVha3MgPSBoJGJyZWFrcywgYWRkID0gVFJVRSkKCnJ1ZyhZX2NvbnN0X3N0YW5fc2NhbGVkWydjVmVnX2xuZF9zdW0nXSwgbHdkID0gMikKCnBvbHlnb24oeCA9IGMoMzAwLCA4MDAsIDgwMCwgMzAwKSwgeSA9IGMoMCwgMCwgMTAwMCwgMTAwMCksCiAgICAgICAgY29sID0gbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sLCA2MCksCiAgICAgICBib3JkZXIgPSAgbWFrZVRyYW5zcGFyZW50KHJhbmdlY29sKSkKCiNkZXYub2ZmKCkKCnJlc2V0KCkKCmxlZ2VuZCgndG9wJywgaG9yaXogPSBUUlVFLCBmaWxsID0gYyhtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLCAxNTApLCBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLCAxNTApLCBtYWtlVHJhbnNwYXJlbnQocmFuZ2Vjb2wsIDYwKSksIGxlZ2VuZCA9IGMoJ1dhdmUwMCcsICdXYXZlMDEnLCAnQVcgcmFuZ2UnKSkKYGBgCiMjIFdoYXQgcHJvcG9ydGlvbiBvZiBtb2RlbHMgKm5vdyogZmFsbCB3aXRoaW4gQW5keSdzIGNvbnN0cmFpbnRzPwoKSnVzdCBvdmVyIGEgdGhpcmQhIEJldHRlciB0aGFuIGJlZm9yZSwgYnV0IHN0aWxsIG5vdCBncmVhdC4gUG9pbnRpbmcgYXQgYSBzaWduaWZpY2FudCBtb2RlbCBkaXNjcmVwZW5jeSBpbiBjVmVnCgpgYGB7cn0KQVdfY29uc3RyYWludHMgPC0gbWF0cml4KG5yb3cgPSAyLCBuY29sID0gbGVuZ3RoKHluYW1lc19jb25zdCkpCgpBV19jb25zdHJhaW50c1sxLF0gPC0gYygwLCAzNSwgNzUwLCAzMDApCkFXX2NvbnN0cmFpbnRzWzIsXSA8LSBjKDEwMCwgODAsIDMwMDAsIDgwMCkKCmNvbG5hbWVzKEFXX2NvbnN0cmFpbnRzKSA8LSB5bmFtZXNfY29uc3QKcm93bmFtZXMoQVdfY29uc3RyYWludHMpIDwtIGMoJ21pbicsICdtYXgnKQoKCiMgY29uZm9ybSB0byBBbmR5J3MgYmFzaWMgY29uc3RyYWludHMKI2xldmVsMl9peF93YXZlMDEgPC0gd2hpY2goYXBwbHkoWV9jb25zdF93YXZlMDFfc2NhbGVkLCAxLCBGVU4gPSB3aXRoaW5SYW5nZSwgbWF4ZXMgID0gQVdfY29uc3RyYWludHNbMixdLCBtaW5zID0gQVdfY29uc3RyYWludHNbMSxdICkpCgojbmxldmVsMl9peF93YXZlMDEgPC0gd2hpY2goYXBwbHkoWV9jb25zdF93YXZlMDFfc2NhbGVkLCAxLCBGVU4gPSB3aXRoaW5SYW5nZSwgbWF4ZXMgID0gQVdfY29uc3RyYWludHNbMixdLCBtaW5zID0gQVdfY29uc3RyYWludHNbMSxdICkgPT0gRkFMU0UpCgpsZXZlbDJfaXhfd2F2ZTAxIDwtIHdoaWNoKFlfY29uc3Rfd2F2ZTAxX3NjYWxlZFssJ25icF9sbmRfc3VtJ10gPiAwICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X3dhdmUwMV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmIFlfY29uc3Rfd2F2ZTAxX3NjYWxlZFssJ25wcF9ubGltX2xuZF9zdW0nXSA8IDgwICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X3dhdmUwMV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10gPiA3NTAgJiBZX2NvbnN0X3dhdmUwMV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10gPCAzMDAwICYKICAgICAgICAgICAgICAgICAgWV9jb25zdF93YXZlMDFfc2NhbGVkWywnY1ZlZ19sbmRfc3VtJ10gPiAzMDAgJiBZX2NvbnN0X3dhdmUwMV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSA8IDgwMAogICAgICAgICAgICAgICAgICApCgoKYGBgCgpPZiB0aGUgNDAwIG1lbWJlcnMgb2YgdGhlIHdhdmUwMSBlbnNlbWJsZSwgMTI4IHBhc3MgQW5keSBXaWx0c2hpcmUncyBMZXZlbCAyIGNvbnN0cmFpbnRzLgoKYGBge3J9CgpsZW5ndGgobGV2ZWwyX2l4X3dhdmUwMSkKCmBgYAoKUGFpcnMgcGxvdCBvZiB0aGUgaW5wdXRzIHRoYXQgcGFzcyB0aGUgY29uc3RyYWludHMgd2l0aCByZXNwZWN0IHRvIHRoZSBsaW1pdHMgb2YgdGhlIG9yaWdpbmFsIGVuc2VtYmxlLgoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTB9CgpwYWlycyhYX3dhdmUwMVtsZXZlbDJfaXhfd2F2ZTAxLCBdLAogICAgICB4bGltID0gYygwLDEpLAogICAgICB5bGltID0gYygwLDEpLAogICAgICBnYXAgPSAwLAogICAgICBsb3dlci5wYW5lbCA9IE5VTEwsCiAgICAgIHBjaCA9IDIwLAogICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLDIwMCkKICAgICAgKQoKYGBgCgojIyBUaW1lc2VyaWVzIG9mIG1lYW4gY2FyYm9uIGN5Y2xlIHByb3BlcnRpZXMgb3ZlciB3aG9sZSBydW4uCgpgYGB7cn0KCiMgCiNUaGlzIGhhcyBhIHByb2JsZW0gd2l0aCB2YXJpYWJsZSBsZW5ndGhzIG9mIHRpbWUgaW4gdGhlIHJ1bnMgKGVnIFAwNTA5KQoKIyBtYWtlVGltZXNlcmllc0Vuc2VtYmxlIDwtIGZ1bmN0aW9uKGVuc2xvYywgdmFyaWFibGUsIG5zdGFydCwgbmVuZCwgbnRzID0gMTY0LCBjbiA9IDE4NTA6MjAxMyl7CiMgCiMgICB5c2VjIDwtIDMxNTM2MDAwCiMgCiMgICBuZW5zIDwtIChuZW5kIC0gbnN0YXJ0KSArIDEKIyAgICMgbmVucyBpcyBudW1iZXIgb2YgZW5zZW1ibGUgbWVtYmVycwojICAgIyBudHMgbGVuZ3RoIG9mIHRpbWVzZXJpZXMKIyAgICMgY24gaXMgY29sbmFtZXMoKQojICAgZGF0bWF0IDwtIG1hdHJpeChOQSwgbnJvdyA9IG5lbnMsIG5jb2wgPSBudHMpCiMgICBjb2xuYW1lcyhkYXRtYXQpIDwtIGNuCiMgCiMgICBlbnNsaXN0IDwtIHBhc3RlKCJQIiwgZm9ybWF0Qyhuc3RhcnQ6bmVuZCwgd2lkdGg9NCwgZmxhZz0iMCIpLCBzZXA9IiIpCiMgCiMgICBmb3IoaSBpbiAxOm5lbnMpewojIAojICAgICAjdmVjIDwtIHJlcChOQSxudHMpCiMgCiMgICAgIGVuc21lbWJlciA8LSBlbnNsaXN0W2ldCiMgICAgICNwcmludChlbnNtZW1iZXIpCiMgCiMgICAgIGZuIDwtIHBhc3RlMChlbnNsb2MsJ0pVTEVTLUVTLTFwMF8nLGVuc21lbWJlciwnX0FubnVhbF9nbG9iYWwubmMnKQojIAojIAojICAgICB0cnkobmMgPC0gbmNfb3BlbihwYXN0ZTAoZm4pKSkKIyAgICAgdHJ5KGxvY2FsdGltZSA8LSBuY3Zhcl9nZXQobmMsICd0aW1lJykpCiMgCiMgICAgICMgVGhpcyBwYXJ0IGNvbXBlbnNhdGVzIGZvciB0aGUgZmFjdCB0aGF0IHNvbWV0aW1lcyB5ZWFycyBhcmUgbWlzc2luZwojICAgICB0cnkobG9jYWx5ZWFyIDwtIGZsb29yKDIwMTAgKyAobG9jYWx0aW1lIC8geXNlYykpKQojICAgICB0cnkoaXggPC0gd2hpY2goY24laW4lbG9jYWx5ZWFyKSkKIyAKIyAgICAgdHJ5KGRhdCA8LSBleHRyYWN0VGltZXNlcmllcyhuYywgdmFyaWFibGUpKQojIAojICAgICB0cnkoZGF0bWF0W2ksIGl4XSA8LSBkYXQpCiMgICAgIG5jX2Nsb3NlKG5jKQojICAgfQojICAgZGF0bWF0CiMgfQoKCgojIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUgPC0gZnVuY3Rpb24oZW5zbG9jLCB2YXJpYWJsZSwgbnN0YXJ0LCBuZW5kLCBudHMgPSAxNjQsIGNuID0gMTg1MDoyMDEzKXsKIyAgIAojICAgbmVucyA8LSAobmVuZCAtIG5zdGFydCkgKyAxCiMgICAjIG5lbnMgaXMgbnVtYmVyIG9mIGVuc2VtYmxlIG1lbWJlcnMKIyAgICMgbnRzIGxlbmd0aCBvZiB0aW1lc2VyaWVzCiMgICAjIGNuIGlzIGNvbG5hbWVzKCkKIyAgIGRhdG1hdCA8LSBtYXRyaXgoTkEsIG5yb3cgPSBuZW5zLCBuY29sID0gbnRzKQojICAgY29sbmFtZXMoZGF0bWF0KSA8LSBjbgojICAgCiMgICBlbnNsaXN0IDwtIHBhc3RlKCJQIiwgZm9ybWF0Qyhuc3RhcnQ6bmVuZCwgd2lkdGg9NCwgZmxhZz0iMCIpLCBzZXA9IiIpCiMgICAjZmxvYyA8LSBwYXN0ZTAoZW5zbG9jLGVuc21lbWJlcixzdWJkaXIpCiMgICAKIyAgIGZvcihpIGluIDE6bmVucyl7CiMgICAgIAojICAgICB2ZWMgPC0gcmVwKE5BLG50cykKIyAgICAgCiMgICAgIGVuc21lbWJlciA8LSBlbnNsaXN0W2ldIAojICAgICAKIyAgICAgZm4gPC0gcGFzdGUwKGVuc2xvYyxlbnNtZW1iZXIsJy9zdGF0cy8nLCdKVUxFUy1FUy0xcDBfJyxlbnNtZW1iZXIsJ19Bbm51YWxfZ2xvYmFsLm5jJykKIyAgICAgCiMgICAgIAojICAgICB0cnkobmMgPC0gbmNfb3BlbihwYXN0ZTAoZm4pKSkKIyAgICAgdHJ5KGRhdCA8LSBleHRyYWN0VGltZXNlcmllcyhuYywgdmFyaWFibGUpKQojICAgICAKIyAgICAgZGF0bWF0W2ksIF0gPC0gZGF0CiMgICAgIG5jX2Nsb3NlKG5jKQojICAgfQojICAgZGF0bWF0CiMgfQoKYGBgCgoKYGBge3J9CgppZiAoZmlsZS5leGlzdHMoImVuc2VtYmxlX3RpbWVzZXJpZXNfd2F2ZTAxXzIwMjItMDQtMDgucmRhdGEiKSkgewogIGxvYWQoImVuc2VtYmxlX3RpbWVzZXJpZXNfd2F2ZTAxXzIwMjItMDQtMDgucmRhdGEiKQp9IGVsc2UgewogIAogICMgcHJpbWFyeSBjYXJib24gY3ljbGUgb3V0cHV0cwogICBucHBfZW5zX3dhdmUwMSA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCwgdmFyaWFibGUgPSAibnBwX25saW1fbG5kX3N1bSIpIC8gKDFlMTIveXNlYykKICAgbmJwX2Vuc193YXZlMDEgPC0gIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUoZW5zbG9jID0gZW5zbG9jX3dhdmUwMSxuc3RhcnQgPSBuc3RhcnQsIG5lbmQgPSBuZW5kLHZhcmlhYmxlID0gIm5icF9sbmRfc3VtIikgLyAoMWUxMi95c2VjKQogICBjU29pbF9lbnNfd2F2ZTAxIDwtICBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCx2YXJpYWJsZSA9ICJjU29pbF9sbmRfc3VtIikgLyAxZTEyCiAgIGNWZWdfZW5zX3dhdmUwMSA8LSAgbWFrZVRpbWVzZXJpZXNFbnNlbWJsZShlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAxLG5zdGFydCA9IG5zdGFydCwgbmVuZCA9IG5lbmQsdmFyaWFibGUgPSAiY1ZlZ19sbmRfc3VtIikgLyAxZTEyCiAgIyAKICAjIAogICBsYWlfbG5kX21lYW5fZW5zX3dhdmUwMSA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCx2YXJpYWJsZSA9ICJsYWlfbG5kX21lYW4iKQogICMgCiAgIyAjIGZsdXhlcwogICByaF9sbmRfc3VtX2Vuc193YXZlMDEgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZShlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAxLG5zdGFydCA9IG5zdGFydCwgbmVuZCA9IG5lbmQsIHZhcmlhYmxlID0gInJoX2xuZF9zdW0iKSAvICgxZTEyL3lzZWMpCiAgIGZMdWNfbG5kX3N1bV9lbnNfd2F2ZTAxIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUoZW5zbG9jID0gZW5zbG9jX3dhdmUwMSxuc3RhcnQgPSBuc3RhcnQsIG5lbmQgPSBuZW5kLCB2YXJpYWJsZSA9ICJmTHVjX2xuZF9zdW0iKSAvICgxZTEyL3lzZWMpCiAgIGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3dhdmUwMSA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCwgdmFyaWFibGUgPSAiZkhhcnZlc3RfbG5kX3N1bSIpIC8gKDFlMTIveXNlYykKICAjIAogICMgCiAgIyAjIGZyYWN0aW9ucwogICB0cmVlRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUoZW5zbG9jID0gZW5zbG9jX3dhdmUwMSxuc3RhcnQgPSBuc3RhcnQsIG5lbmQgPSBuZW5kLCAgdmFyaWFibGUgPSAidHJlZUZyYWNfbG5kX21lYW4iKQogICBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMSA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlKGVuc2xvYyA9IGVuc2xvY193YXZlMDEsbnN0YXJ0ID0gbnN0YXJ0LCBuZW5kID0gbmVuZCwgIHZhcmlhYmxlID0gInNocnViRnJhY19sbmRfbWVhbiIpCiAgIGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGUoZW5zbG9jID0gZW5zbG9jX3dhdmUwMSxuc3RhcnQgPSBuc3RhcnQsIG5lbmQgPSBuZW5kLCAgdmFyaWFibGUgPSAiYmFyZXNvaWxGcmFjX2xuZF9tZWFuIikKICAgCiAgICAgYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDEgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZShlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAxLCBuc3RhcnQgPSBuc3RhcnQsIG5lbmQgPSBuZW5kLHZhcmlhYmxlID0gImMzUGZ0RnJhY19sbmRfbWVhbiIpCiAgYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDEgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZShlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAxLCBuc3RhcnQgPSBuc3RhcnQsIG5lbmQgPSBuZW5kLHZhcmlhYmxlID0gImM0UGZ0RnJhY19sbmRfbWVhbiIpCiAgIAogICAKICAKICAgc2F2ZShucHBfZW5zX3dhdmUwMSwKICAgICAgICBuYnBfZW5zX3dhdmUwMSwKICAgICAgICBjU29pbF9lbnNfd2F2ZTAxLAogICAgICAgIGNWZWdfZW5zX3dhdmUwMSwKICAgICAgICBsYWlfbG5kX21lYW5fZW5zX3dhdmUwMSwKICAgICAgICByaF9sbmRfc3VtX2Vuc193YXZlMDEsCiAgICAgICAgZkx1Y19sbmRfc3VtX2Vuc193YXZlMDEsCiAgICAgICAgZkhhcnZlc3RfbG5kX3N1bV9lbnNfd2F2ZTAxLAogICAgICAgIHRyZWVGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDEsCiAgICAgICAgc2hydWJGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDEsCiAgICAgICAgYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDEsCiAgICAgICAgYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDEsCiAgICAgICAgYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDEsCiAgICAgICBmaWxlID0gImVuc2VtYmxlX3RpbWVzZXJpZXNfd2F2ZTAxXzIwMjItMDQtMDgucmRhdGEiICkKfQoKI3RvdGFsX2xhbmRfY2FyYm9uX2Vuc193YXZlMDEgPC0gY1NvaWxfZW5zX3dhdmUwMSArIGNWZWdfZW5zX3dhdmUwMQoKYGBgCgoKCiMjIHRpbWVzZXJpZXMgb3V0bGllcnMKClRpbWVzZXJpZXMgdGhhdCBoYXZlIHByb2JsZW1zLiBOQlAsIFJIIGFuZCBjU29pbCBzZWVtcyB0byBoYXZlIGxhcmdlIG91dGxpZXJzCmBgYHtyfQoKIyBUaGVzZSBpbmRpY2VzIHJlZmVyZW5jZSB0aGUgc2VwYXJhdGUgZW5zZW1ibGVzCiMgY1NvaWwgb3ZlciA2MDAwCiMgcmggb3ZlciAyMDAKIyBuYnAgbGVzcyB0aGFuIC0xNQpjU29pbF9vdXRsaWVyX2l4X3dhdmUwMCA8LSB1bmlxdWUod2hpY2goY1NvaWxfZW5zID4gNjAwMCwgYXJyLmluZCA9IFRSVUUpWywncm93J10pCmNTb2lsX291dGxpZXJfaXhfd2F2ZTAxIDwtIHVuaXF1ZSh3aGljaChjU29pbF9lbnNfd2F2ZTAxID4gNjAwMCwgYXJyLmluZCA9IFRSVUUpWywncm93J10pCgpuYnBfb3V0bGllcl9peF93YXZlMDAgPC0gdW5pcXVlKHdoaWNoKG5icF9lbnMgPCAtMTUsIGFyci5pbmQgPSBUUlVFKVssJ3JvdyddKQpuYnBfb3V0bGllcl9peF93YXZlMDEgPC0gdW5pcXVlKHdoaWNoKG5icF9lbnNfd2F2ZTAxIDwgLTE1LCBhcnIuaW5kID0gVFJVRSlbLCdyb3cnXSkKCnJoX2xuZF9zdW1fb3V0bGllcl9peF93YXZlMDAgPC0gdW5pcXVlKHdoaWNoKHJoX2xuZF9zdW1fZW5zID4gMjAwLCBhcnIuaW5kID0gVFJVRSlbLCdyb3cnXSkKcmhfbG5kX3N1bV9vdXRsaWVyX2l4X3dhdmUwMSA8LSB1bmlxdWUod2hpY2gocmhfbG5kX3N1bV9lbnNfd2F2ZTAxID4gMjAwLCBhcnIuaW5kID0gVFJVRSlbLCdyb3cnXSkKCgojIGFyZSB0aGVyZSBhZGRpdGlvbmFsIGV4Y2x1ZGVkIGluZGljZXMgdG8gdGhvc2UgYWxyZWFkeSBleGNsdWRlZCBieSB0aGUgY29uc3RyYWludAoKd2F2ZTAxX2FsbF9peCA8LSAxOm50cmFpbl93YXZlMDEKCiMgSW5kaWNlcyBleGNsdWRlZCBpbiB3YXZlMDEgbGV2ZWwyCmxldmVsMl9uaXhfd2F2ZTAxIDwtIHNldGRpZmYod2F2ZTAxX2FsbF9peCwgbGV2ZWwyX2l4X3dhdmUwMSkKCiMgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIGlmIHRoZXNlIGxvb2sgbm9ybWFsIGluIG90aGVyIHdheXMKdHNfb3V0bGllcnNfaXhfd2F2ZTAxIDwtIHVuaXF1ZShjKGNTb2lsX291dGxpZXJfaXhfd2F2ZTAxLG5icF9vdXRsaWVyX2l4X3dhdmUwMSwgcmhfbG5kX3N1bV9vdXRsaWVyX2l4X3dhdmUwMSkpCiMgYXJlIHRoZXJlIGFueSB0aGF0IGFyZSBub3QgZXhjbHVkZWQgYnkgbGV2ZWwgMj8gKEkgYXNzdW1lIHNvKQppbnRlcnNlY3QodHNfb3V0bGllcnNfaXhfd2F2ZTAxLCBsZXZlbDJfbml4X3dhdmUwMSkKCndpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxIDwtIHNldGRpZmYod2F2ZTAxX2FsbF9peCx0c19vdXRsaWVyc19peF93YXZlMDEpCgojIFJlbW92ZSB0aGVzZSBmcm9tIHRoZSB3YXZlMDEgZW5zZW1ibGUgdG8gcmVtb3ZlIG91dGxpZXJzIGFuZCBleGNsdWRlZCBlbnNlbWJsZSBtZW1iZXJzCmxldmVsMl9hbmRfdHNfb3V0bGllcnNfbml4X3dhdmUwMSA8LSB1bmlvbihsZXZlbDJfbml4X3dhdmUwMSwgdHNfb3V0bGllcnNfaXhfd2F2ZTAxKQoKbGV2ZWwyYV9peF93YXZlMDEgPC0gc2V0ZGlmZih3YXZlMDFfYWxsX2l4LCBsZXZlbDJfYW5kX3RzX291dGxpZXJzX25peF93YXZlMDEpCgp3YXZlMDBfYWxsX2l4IDwtIDE6NDk5CnRzX291dGxpZXJzX2l4X3dhdmUwMCA8LSB1bmlxdWUoYyhjU29pbF9vdXRsaWVyX2l4X3dhdmUwMCxuYnBfb3V0bGllcl9peF93YXZlMDAsIHJoX2xuZF9zdW1fb3V0bGllcl9peF93YXZlMDApKQp3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCA8LSBzZXRkaWZmKHdhdmUwMF9hbGxfaXgsdHNfb3V0bGllcnNfaXhfd2F2ZTAwKQoKYGBgCgoKCmBgYHtyIHBsb3QtY2FyYm9uLWN5Y2xlLXRpbWVzZXJpZXMtcHJpbWFyeSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMn0KCmxjb2xfd2F2ZTAgPC0gbWFrZVRyYW5zcGFyZW50KCdkb2RnZXJibHVlMicsICAxMjApCmxjb2xfd2F2ZTAxIDwtIG1ha2VUcmFuc3BhcmVudCgnZmlyZWJyaWNrJywgIDEyMCkKbGNvbF93YXZlMDFfbGV2ZWwyIDwtICdnb2xkJwpzdGFuY29sID0gJ2JsYWNrJwoKbGluZVBsb3RNdWx0aUVucyA8LSBmdW5jdGlvbih5ZWFycywgZW5zMSwgZW5zMiwgZW5zMywgY29sMSwgY29sMiwgY29sMywgeWxhYiwgbWFpbiwgeWxpbSA9IE5VTEwpewogICMgUGxvdCB3YXZlMDAgYW5kIHdhdmUwMSB0aW1lc2VyaWVzIG9uIHRvcCBvZiBvbmUgYW5vdGhlcgogIAogIG50IDwtIGxlbmd0aCh5ZWFycykgCiAgaWYoaXMubnVsbCh5bGltKSl7CiAgICAKICB5bGltID0gcmFuZ2UoYyhlbnMxWywxXSwgZW5zMVssbnRdLCBlbnMyWywxXSwgZW5zMlsgLG50XSwgZW5zM1ssMV0sIGVuczNbLCBudF0pKQogIH0KICAKICBlbHNlIHlsaW0gPC0geWxpbQogIAogIG1hdHBsb3QoeWVhcnMsIHQoZW5zMSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IGNvbDEsCiAgICAgICAgeWxhYiA9IHlsYWIsIG1haW4gPSBtYWluLCB4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nKQogIG1hdGxpbmVzKHllYXJzLCB0KGVuczIpLCBjb2wgPSBjb2wyLCBsdHkgPSAnc29saWQnKQogICAgbWF0bGluZXMoeWVhcnMsIHQoZW5zMyksIGNvbCA9IGNvbDMsIGx0eSA9ICdzb2xpZCcpCn0KCiNwZGYoZmlsZSA9ICdmaWdzL2NhcmJvbi1jeWNsZS10aW1lc2VyaWVzLXdhdmVzLWNvbnN0cmFpbmVkLnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEyKQpwYXIobWZyb3c9IGMoMyw1KSwgbGFzID0gMSwgbWFyID0gYyg0LDQsMSwwKSkKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IG5wcF9lbnNbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gbnBwX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gbnBwX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnTlBQJykKCmxpbmVzKHllYXJzLG5wcF9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gIG5icF9lbnNbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwgCiAgICAgICAgICAgICAgICAgZW5zMiA9IG5icF9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IG5icF9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnTkJQJywgeWxpbSA9IGMoLTEwLDEwKSkKCmxpbmVzKHllYXJzLCBuYnBfc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGNTb2lsX2Vuc1t3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjU29pbF9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGNTb2lsX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1NvaWwnLCB5bGltID0gcmFuZ2UoYyhjU29pbF9lbnNbLDFdLCBjU29pbF9lbnNbLDE2NF0pKSkKCmxpbmVzKHllYXJzLCBjU29pbF9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gY1ZlZ19lbnNbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gY1ZlZ19lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGNWZWdfZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdjVmVnJykKCmxpbmVzKHllYXJzLCBjVmVnX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSBsYWlfbG5kX21lYW5fZW5zW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGxhaV9sbmRfbWVhbl9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGxhaV9sbmRfbWVhbl9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ0xhaScpCgpsaW5lcyh5ZWFycywgbGFpX2xuZF9tZWFuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSByaF9sbmRfc3VtX2Vuc1t3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSByaF9sbmRfc3VtX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gcmhfbG5kX3N1bV9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsICBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdSSCcpCgpsaW5lcyh5ZWFycywgcmhfbG5kX3N1bV9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gZkx1Y19sbmRfc3VtX2Vuc1t3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBmTHVjX2xuZF9zdW1fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBmTHVjX2xuZF9zdW1fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdmTHVjJykKCmxpbmVzKHllYXJzLCBmTHVjX2xuZF9zdW1fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGZIYXJ2ZXN0X2xuZF9zdW1fZW5zW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBmSGFydmVzdF9sbmRfc3VtX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnZkhhcnZlc3QnKQoKbGluZXMoeWVhcnMsIGZIYXJ2ZXN0X2xuZF9zdW1fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IHRyZWVGcmFjX2xuZF9tZWFuX2Vuc1t3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSB0cmVlRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IHRyZWVGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ3RyZWVmcmFjJwogICAgICAgICAgICAgICAgICkKCmxpbmVzKHllYXJzLCB0cmVlRnJhY19sbmRfbWVhbl9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gc2hydWJGcmFjX2xuZF9tZWFuX2Vuc1t3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBzaHJ1YkZyYWNfbG5kX21lYW5fZW5zW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICdzaHJ1YmZyYWMnCikKCmxpbmVzKHllYXJzLCBzaHJ1YkZyYWNfbG5kX21lYW5fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwKICAgICAgICAgICAgICAgICBlbnMyID0gYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc193YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJyUnLCBtYWluID0gJ2JhcmVzb2lsZnJhYycpCgpsaW5lcyh5ZWFycywgYmFyZXNvaWxGcmFjX2xuZF9tZWFuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBjM1BmdEZyYWNfbG5kX21lYW5fZW5zW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICdjM1BmdEZyYWMnKQoKbGluZXMoeWVhcnMsIGMzUGZ0RnJhY19sbmRfbWVhbl9zdGFuLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc1t3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjNFBmdEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBjNFBmdEZyYWNfbG5kX21lYW5fZW5zX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnYzNQZnRGcmFjJykKCmxpbmVzKHllYXJzLCBjNFBmdEZyYWNfbG5kX21lYW5fc3RhbiwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCgpyZXNldCgpCgpsZWdlbmQoJ2JvdHRvbXJpZ2h0JywgbGVnZW5kID0gYygnd2F2ZTAwJywnd2F2ZTAxJywnd2F2ZTAxIGxldmVsMicsJ3N0YW5kYXJkJyksIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDEuNSwgY29sID0gYyhsY29sX3dhdmUwLCBsY29sX3dhdmUwMSwgbGNvbF93YXZlMDFfbGV2ZWwyLCBzdGFuY29sKSwgaW5zZXQgPSBjKDAuMDUsIDAuMTUpICkKCiNkZXYub2ZmKCkKYGBgClRoaXMgaXMgYSBwbG90IG9mIHRpbWVzZXJpZXMgb2YgV2F2ZTAwLCBXYXZlMDEsIGFuZCBsZXZlbDItY29uc3RyYWluZWQgd2F2ZTAxIG9uIHRvcCBvZiBvbmUgYW5vdGhlci4gV2Ugc2VlIHRoYXQgdGhlIHdhdmUwMSBpcyBjbG9zZXIgdG8gdGhlIHN0YW5kYXJkIHRoYW4gd2F2ZTAwLCBhbmQgdGhlIGxldmVsLTIgY29uc3RyYWluZWQgd2F2ZTAxIGVuc2VtYmxlIGlzIG9mdGVuIGNsb3NlciBhZ2Fpbi4gSG93ZXZlciwgdGhlcmUgYXJlIHN0aWxsIHF1aXRlIGxhcmdlIGRpc2NyZXBhbmNpZXMuIEZvciBleGFtcGxlLCBiYXJlc29pbGZyYWMgaXMgb2Z0ZW4gd2F5IHRvbyBoaWdoLCBzaHJ1YmZyYWMgaXMgb2Z0ZW4gdG9vIGxvdyAodGhvdWdoIGJvdGggdGhlc2Ugc3BhbiB0aGUgc3RhbmRhcmQpLiBUcmVlZnJhYyBpcyBhd2F5IGZyb20gemVybywgYnV0IHN0aWxsIG9mdGVuIHRvbyBsb3cgb3IgdG9vIGhpZ2guIFdoaWxlIGZIYXJ2ZXN0IGxvb2tzIGdvb2QsIGZMdWMgZG9lcyBub3QgYXBwZWFyIGNvbnN0cmFpbmVkIGJ5IHRoZSBwcm9jZXNzIGF0IGFsbC4gUkggKHNvaWwgcmVzcGlyYXRpb24pIGxvb2tzIHdlbGwgY29uc3RyYWluZWQsIHdoZXJlYXMgbGFpIGlzIG9mdGVuIHRvbyBsb3cuICAKCk9uZSB0aGluZyB3ZSBjb3VsZCBkbyBuZXh0IGlzIGNvbnN0cmFpbiBpbnB1dCBzcGFjZSBhZ2FpbiwgdXNpbmcgb2JzZXJ2YXRpb25zIG9yICJ0b2xlcmFuY2UgdG8gZXJyb3IiIG9uIHNvbWUgb3IgYWxsIG9mIHRoZXNlIG91dHB1dHMuICAKCldlIGNvdWxkIGFsc28gZXh0ZW5kIHNlbnNpdGl2aXR5IGFuYWx5c2lzIHRvIHdvcmsgb3V0IHdoYXQgY29udHJvbHMgZS5nLiB0cmVlZnJhYy4KCkEgc3VtbWFyeSBvZiB3aGF0IGdldHMgY29uc3RyYWluZWQgd2hlbiB5b3UgY29uc3RyYWluIHRoZSB0b3AtbGV2ZWwgdmFyaWFibGVzIHdvdWxkIGJlIGEgdXNlZnVsIGFhbmFseXNpcy4KCgojIyBBbm9tYWx5IHRpbWVzZXJpZXMKClNpbWlsYXIgdG8gYWJvdmUsIGJ1dCBvdXRwdXQgYW5vbWFseQpgYGB7cn0KbnBwX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChucHBfZW5zX3dhdmUwMSwgMToyMCkKbmJwX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChuYnBfZW5zX3dhdmUwMSwgMToyMCkKY1NvaWxfZW5zX2Fub21fd2F2ZTAxIDwtIGFub21hbGl6ZVRTbWF0cml4KGNTb2lsX2Vuc193YXZlMDEsIDE6MjApCmNWZWdfZW5zX2Fub21fd2F2ZTAxIDwtIGFub21hbGl6ZVRTbWF0cml4KGNWZWdfZW5zX3dhdmUwMSwgMToyMCkKCnJoX2xuZF9zdW1fZW5zX2Fub21fd2F2ZTAxIDwtIGFub21hbGl6ZVRTbWF0cml4KHJoX2xuZF9zdW1fZW5zX3dhdmUwMSwgMToyMCkKZkx1Y19sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChmTHVjX2xuZF9zdW1fZW5zX3dhdmUwMSwgMToyMCkKbGFpX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChsYWlfbG5kX21lYW5fZW5zX3dhdmUwMSwgMToyMCkgCgpmSGFydmVzdF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeChmSGFydmVzdF9sbmRfc3VtX2Vuc193YXZlMDEsIDE6MjApCnRyZWVGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMSA8LSBhbm9tYWxpemVUU21hdHJpeCh0cmVlRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxLCAxOjIwKQpzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxIDwtIGFub21hbGl6ZVRTbWF0cml4KHNocnViRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxLCAxOjIwKQpiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxIDwtIGFub21hbGl6ZVRTbWF0cml4KGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxLCAxOjIwKQpjM1BmdEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxIDwtIGFub21hbGl6ZVRTbWF0cml4KGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxLCAxOjIwKQpjNFBmdEZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxIDwtIGFub21hbGl6ZVRTbWF0cml4KGM0UGZ0RnJhY19sbmRfbWVhbl9lbnNfd2F2ZTAxLCAxOjIwKQoKI3RvdGFsX2xhbmRfY2FyYm9uX2Fub21fd2F2ZTAxIDwtIGFub21hbGl6ZVRTbWF0cml4KHRvdGFsX2xhbmRfY2FyYm9uX2Vuc193YXZlMDEsIDE6MjApCgoKCgoKYGBgCgpgYGB7cn0KCmFub21hbGl6ZVRTIDwtIGZ1bmN0aW9uKHgsIGl4ID0gMToyMCl7eCAtIG1lYW4oeFtpeF0pIH0gCm5wcF9zdGFuX2Fub20gPC0gYW5vbWFsaXplVFMobnBwX3N0YW4pCgpuYnBfc3Rhbl9hbm9tIDwtIGFub21hbGl6ZVRTKG5icF9zdGFuKQpjU29pbF9zdGFuX2Fub20gPC1hbm9tYWxpemVUUyhjU29pbF9zdGFuKQpjVmVnX3N0YW5fYW5vbSA8LSBhbm9tYWxpemVUUyhjVmVnX3N0YW4pCmxhaV9sbmRfbWVhbl9zdGFuX2Fub20gPC0gYW5vbWFsaXplVFMobGFpX2xuZF9tZWFuX3N0YW4pCgoKIyBmbHV4ZXMKcmhfbG5kX3N1bV9zdGFuX2Fub20gPC0gYW5vbWFsaXplVFMocmhfbG5kX3N1bV9zdGFuKQpmTHVjX2xuZF9zdW1fc3Rhbl9hbm9tIDwtIGFub21hbGl6ZVRTKGZMdWNfbG5kX3N1bV9zdGFuKQpmSGFydmVzdF9sbmRfc3VtX3N0YW5fYW5vbSA8LSBhbm9tYWxpemVUUyhmSGFydmVzdF9sbmRfc3VtX3N0YW4pCgoKIyBmcmFjdGlvbnMKdHJlZUZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tIDwtIGFub21hbGl6ZVRTKHRyZWVGcmFjX2xuZF9tZWFuX3N0YW4pCnNocnViRnJhY19sbmRfbWVhbl9zdGFuX2Fub20gPC0gYW5vbWFsaXplVFMoc2hydWJGcmFjX2xuZF9tZWFuX3N0YW4pCmJhcmVzb2lsRnJhY19sbmRfbWVhbl9zdGFuX2Fub20gPC0gYW5vbWFsaXplVFMoYmFyZXNvaWxGcmFjX2xuZF9tZWFuX3N0YW4pCmMzUGZ0RnJhY19sbmRfbWVhbl9zdGFuX2Fub20gPC0gYW5vbWFsaXplVFMoYzNQZnRGcmFjX2xuZF9tZWFuX3N0YW4pCmM0UGZ0RnJhY19sbmRfbWVhbl9zdGFuX2Fub20gPC0gYW5vbWFsaXplVFMoYzRQZnRGcmFjX2xuZF9tZWFuX3N0YW4pCmBgYAoKCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMn0KCgojcGRmKGZpbGUgPSAnZmlncy9jYXJib24tY3ljbGUtdGltZXNlcmllcy1hbm9tYWx5LXdhdmVzLWNvbnN0cmFpbmVkLnBkZicsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEyKQpwYXIobWZyb3c9IGMoMyw1KSwgbGFzID0gMSwgbWFyID0gYyg0LDQsMSwwKSkKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IG5wcF9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBucHBfZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IG5wcF9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnTlBQJykKCmxpbmVzKHllYXJzLG5wcF9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9ICBuYnBfZW5zX2Fub21bd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSwgCiAgICAgICAgICAgICAgICAgZW5zMiA9IG5icF9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gbmJwX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ05CUCcsIHlsaW0gPSBjKC0xMCwxMCkpCgpsaW5lcyh5ZWFycywgbmJwX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGNTb2lsX2Vuc19hbm9tW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGNTb2lsX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBjU29pbF9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnY1NvaWwnLCB5bGltID0gcmFuZ2UoYyhjU29pbF9lbnNfYW5vbVssMV0sIGNTb2lsX2Vuc19hbm9tWywxNjRdKSkpCgpsaW5lcyh5ZWFycywgY1NvaWxfc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gY1ZlZ19lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBjVmVnX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBjVmVnX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdjVmVnJykKCmxpbmVzKHllYXJzLCBjVmVnX3N0YW5fYW5vbSwgY29sID0gc3RhbmNvbCwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMikKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgZW5zMSA9IGxhaV9sbmRfbWVhbl9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBsYWlfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAxLF0sCiAgICAgICAgICAgICAgICAgZW5zMyA9IGxhaV9sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbbGV2ZWwyYV9peF93YXZlMDEsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAsIGNvbDIgPSBsY29sX3dhdmUwMSwgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnTGFpJykKCmxpbmVzKHllYXJzLCBsYWlfbG5kX21lYW5fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gcmhfbG5kX3N1bV9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSByaF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSByaF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCAgY29sMyA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnUkgnKQoKbGluZXMoeWVhcnMsIHJoX2xuZF9zdW1fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gZkx1Y19sbmRfc3VtX2Vuc19hbm9tW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGZMdWNfbG5kX3N1bV9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gZkx1Y19sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdmTHVjJykKCmxpbmVzKHllYXJzLCBmTHVjX2xuZF9zdW1fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gZkhhcnZlc3RfbG5kX3N1bV9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSBmSGFydmVzdF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdLAogICAgICAgICAgICAgICAgIGVuczMgPSBmSGFydmVzdF9sbmRfc3VtX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnR3RDJywgbWFpbiA9ICdmSGFydmVzdCcpCgpsaW5lcyh5ZWFycywgZkhhcnZlc3RfbG5kX3N1bV9zdGFuX2Fub20sIGNvbCA9IHN0YW5jb2wsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIpCgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0geWVhcnMsIGVuczEgPSB0cmVlRnJhY19sbmRfbWVhbl9lbnNfYW5vbVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCxdLAogICAgICAgICAgICAgICAgIGVuczIgPSB0cmVlRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gdHJlZUZyYWNfbG5kX21lYW5fZW5zX2Fub21fd2F2ZTAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICd0cmVlZnJhYycKICAgICAgICAgICAgICAgICApCgpsaW5lcyh5ZWFycywgdHJlZUZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gc2hydWJGcmFjX2xuZF9tZWFuX2Vuc19hbm9tW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IHNocnViRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gc2hydWJGcmFjX2xuZF9tZWFuX2Vuc19hbm9tW2xldmVsMmFfaXhfd2F2ZTAxLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwLCBjb2wyID0gbGNvbF93YXZlMDEsIGNvbDMgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9ICclJywgbWFpbiA9ICdzaHJ1YmZyYWMnCikKCmxpbmVzKHllYXJzLCBzaHJ1YkZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHllYXJzLCBlbnMxID0gYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19hbm9tW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnYmFyZXNvaWxmcmFjJykKCmxpbmVzKHllYXJzLCBiYXJlc29pbEZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnYzNQZnRGcmFjJykKCmxpbmVzKHllYXJzLCBjM1BmdEZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSB5ZWFycywgYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tW3dpdGhvdXRfb3V0bGllcnNfaXhfd2F2ZTAwLF0sCiAgICAgICAgICAgICAgICAgZW5zMiA9IGM0UGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV93YXZlMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsXSwKICAgICAgICAgICAgICAgICBlbnMzID0gYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3dhdmUwMVtsZXZlbDJhX2l4X3dhdmUwMSwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMCwgY29sMiA9IGxjb2xfd2F2ZTAxLCBjb2wzID0gbGNvbF93YXZlMDFfbGV2ZWwyLAogICAgICAgICAgICAgICAgIHlsYWIgPSAnJScsIG1haW4gPSAnYzNQZnRGcmFjJykKCmxpbmVzKHllYXJzLCBjNFBmdEZyYWNfbG5kX21lYW5fc3Rhbl9hbm9tLCBjb2wgPSBzdGFuY29sLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsJ3dhdmUwMScsJ3dhdmUwMSBsZXZlbDInLCdzdGFuZGFyZCcpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAxLjUsIGNvbCA9IGMobGNvbF93YXZlMCwgbGNvbF93YXZlMDEsIGxjb2xfd2F2ZTAxX2xldmVsMiwgc3RhbmNvbCksIGluc2V0ID0gYygwLjA1LCAwLjE1KSApCgoKI2Rldi5vZmYoKQoKYGBgCgoKCgojIEVtdWxhdG9yIGZpdHMKCldlIGhvcGUgdGhhdCBydW5uaW5nIHRoZSBuZXcgZW5zZW1ibGUgZ2l2ZXMgdXMgYSBiZXR0ZXIgZW11bGF0b3IsIGFuZCBhbGxvd3MgdXMgdG8gcnVsZSBvdXQgbW9yZSBpbnB1dCBzcGFjZS4KV2UgcGFydGljdWxhcmx5IGhvcGUgdGhhdCB0aGUgZW11bGF0b3IgaXMgYmV0dGVyIGZvciB0aG9zZSBtZW1iZXJzIHRoYXQgYXJlIGluc2lkZSBBVydzIGNvbnN0cmFpbnRzLgoKRmlyc3QsIHdlIGNhbiBsb29rIGF0IHRoZSBlbXVsYXRvciBlcnJvcnMgaW4gdHdvIGNhc2VzOiBUaGUgbGV2ZWwxYSBkYXRhIChhIGJhc2ljIGNhcmJvbiBjeWNsZSksIGFuZCB0aGVuIHdpdGggdGhlIFdhdmUwMSBkYXRhLCB3aGljaCBzaG91bGQgaGF2ZSBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcy4gKFdlIHNob3VsZCBoYXZlIGVsaW1pbmF0ZWQgcmVhbGx5IGJhZCBzaW11bGF0aW9ucywgYnV0IHdhdmUwMSBpcyBub3QgY29uc3RyYWluZWQgdGhlIGRhdGEgcGVyZmVjdGx5IHRvIGJlIHdpdGhpbiBBVyBjb25zdHJhaW50cy4pCgoKYGBge3J9CiMjIEVtdWxhdG9yIGZpdCBsaXN0IG9mIGxldmVsIDFhIGVuc2VtYmxlCgojZml0X2xpc3RfY29uc3RfbGV2ZWwxYSA8LSBjcmVhdGVLbUZpdExpc3QoWCA9IFhfbGV2ZWwxYSwgWSA9IFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpCgpZX2NvbnN0X2xldmVsMWFfc2NhbGVkX2xpc3QgPC0gbWF0Mmxpc3QoWV9jb25zdF9sZXZlbDFhX3NjYWxlZCkKCmZpdF9saXN0X2NvbnN0X2xldmVsMWEgPC0gbWNsYXBwbHkoWCA9IFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRfbGlzdCwgRlVOID0ga20sIGZvcm11bGEgPSB+LiwgZGVzaWduID0gWF9sZXZlbDFhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jLmNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QodHJhY2UgPSBGQUxTRSkpCgoKCgpgYGAKCgoKYGBge3J9CiMjIFJlbW92ZSBhbnkgIHRpbWVzZXJpZXMgb3V0bGllcnMgZnJvbSB0aGUgbmV3IHdhdmUgYW5kIGJ1aWxkIGVtdWxhdG9ycwojIEJpbmQgdG9nZXRoZXIgdGhlIGlucHV0IG1hdHJpY2VzIGFuZCBzY2FsZWQgb3V0cHV0IGRhdGEKCgojWF9sZXZlbDFhX3dhdmUwMSA8LSByYmluZChYX2xldmVsMWEsIFhfd2F2ZTAxX3RyYWluKVstNDQwLCBdClhfbGV2ZWwxYV93YXZlMDEgPC0gcmJpbmQoWF9sZXZlbDFhLCBYX3dhdmUwMV90cmFpblt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSwgXSkKCllfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkIDwtIHJiaW5kKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQsIFlfY29uc3Rfd2F2ZTAxX3NjYWxlZFt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSwgXSkKCgojYXBwbHkoWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWQgLDIsIHdoaWNoLm1heCkKI2FwcGx5KFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkICwyLCB3aGljaC5taW4pCmBgYAoKCkZvdW5kIHRoZSBvdXRsaWVyIC0gbG9va3MgbGlrZSBpdCdzIDQ0MApgYGB7cn0KCmZpbmRPdXRsaWVycyA8LSBmdW5jdGlvbih4LCBzZHMgPSA2KXsKICAKICBpeCA8LSB3aGljaChhYnMoeCAtIG1lYW4oeCkpID4gKHNkcyAqIHNkKHgpKSkKICAKfQoKYXBwbHkoWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWQgLDIsIGZpbmRPdXRsaWVycywgc2RzID0gMTApCmBgYAoKCmBgYHtyfQojIENyZWF0ZSBmaXQgbGlzdHMgZm9yIHRoZSBjb21iaW5lZCBkYXRhCllfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkX2xpc3QgPC0gbWF0Mmxpc3QoWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWQpCgpmaXRfbGlzdF9jb25zdF9sZXZlbDFhX3dhdmUwMSA8LSBtY2xhcHBseShYID0gWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRfbGlzdCAsIEZVTiA9IGttLCBmb3JtdWxhID0gfi4sIGRlc2lnbiA9IFhfbGV2ZWwxYV93YXZlMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWMuY29yZXMgPSA0LCBjb250cm9sID0gbGlzdCh0cmFjZSA9IEZBTFNFKSkKCgpgYGAKCiMjIExlYXZlLW9uZS1vdXQgYW5hbHlzZXMgb2YgZW11bGF0b3IgcHJlZGljdGlvbiBhY2N1cmFjeQoKYGBge3J9Cgpsb29saXN0X2ttX1lfbGV2ZWwxYSA8LSBtY2xhcHBseShYID0gZml0X2xpc3RfY29uc3RfbGV2ZWwxYSwgRlVOID0gbGVhdmVPbmVPdXQua20sIHR5cGUgPSAnVUsnLCB0cmVuZC5yZWVzdGltID0gVFJVRSkKCmxvb2xpc3Rfa21fWV9sZXZlbDFhX3dhdmUwMSA8LSBtY2xhcHBseShYID0gZml0X2xpc3RfY29uc3RfbGV2ZWwxYV93YXZlMDEsIEZVTiA9IGxlYXZlT25lT3V0LmttLCB0eXBlID0gJ1VLJywgdHJlbmQucmVlc3RpbSA9IFRSVUUpCgpgYGAKCgpgYGB7cn0KCmxvb3N0YXRzX2ttX1lfbGV2ZWwxYSA8LSBsYXBwbHkoZml0X2xpc3RfY29uc3RfbGV2ZWwxYSwgRlVOID0ga21Mb29TdGF0cykKbG9vc3RhdHNfa21fWV9sZXZlbDFhX3dhdmUwMSA8LSBsYXBwbHkoZml0X2xpc3RfY29uc3RfbGV2ZWwxYV93YXZlMDEsIEZVTiA9IGttTG9vU3RhdHMpCgpgYGAKCgpUaGUgdG9wIHJvdyBzaG93cyB0aGUgbGVhdmUtb25lLW91dCBwcmVkaWN0aW9uIGFjY3VyYWN5IG9mIHRoZSBvcmlnaW5hbCB3YXZlMDAgZW5zZW1ibGUsIGFuZCB0aGUgbG93ZXIgcm93IHRoZSBlbnRpcmUgd2F2ZTAwIEFORCB3YXZlMDEgZW5zZW1ibGUgY29tYmluZWQuCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA2fQoKI3BkZihmaWxlID0gJ2ZpZ3Mva21sb29zdGF0c19ZX2xldmVsMWEucGRmJywgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTIpCnBhcihtZnJvdyA9IGMoMiw0KSwgbWFyID0gYygzLDQsMiwyKSwgb21hID0gYyg0LDQsNCwwLjEpKQpmb3IoaSBpbiAxOmxlbmd0aChsb29saXN0X2ttX1lfbGV2ZWwxYSkpewogIAogIHkgPC0gWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssIGldCiAgbG9vIDwtIGxvb2xpc3Rfa21fWV9sZXZlbDFhW1tpXV0KICB5bGltIDwtIHJhbmdlKGMobG9vJG1lYW4gLSAoMipsb28kc2QpLCBsb28kbWVhbiArICgyKmxvbyRzZCkpICkKICBwbG90KHksIGxvbyRtZWFuLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9ICcnICwgeWxpbSA9IHlsaW0sIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsIDEwMCksCiAgICAgICBwY2ggPSAxOSkKICBzZWdtZW50cyh4MCA9IHksIHkwID0gbG9vJG1lYW4gLSAoMipsb28kc2QpICAsIHgxID0geSAsIHkxID0gbG9vJG1lYW4gKyAoMipsb28kc2QpLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLCA1MCkpCiAgYWJsaW5lKDAsMSkKICBsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSBjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKVtpXSwgYnR5ID0gJ24nLCB0ZXh0LmZvbnQgPSAyICApCiAgbGVnZW5kKCdib3R0b21yaWdodCcsbGVnZW5kID0gcGFzdGUoJ3BtYWUgPScscm91bmQobG9vc3RhdHNfa21fWV9sZXZlbDFhW1tpXV0kcG1hZSwyKSwnJScpICwgYnR5ID0gJ24nLCB0ZXh0LmZvbnQgPSAyKQoKfQoKbXRleHQoJ0FjdHVhbCcsIHNpZGUgPSAxLCBsaW5lID0gMSwgb3V0ZXIgPSBUUlVFLCBjZXggPSAyICkKbXRleHQoJ1ByZWRpY3RlZCcsIHNpZGUgPSAyLCBsaW5lID0gMCwgb3V0ZXIgPSBUUlVFLCBjZXggPSAyKSAKbXRleHQoJ0xldmVsIDFhIGVuc2VtYmxlIG91dHB1dHMnLCBzaWRlID0gMywgbGluZSA9IDAsIG91dGVyID0gVFJVRSwgY2V4ID0gMikKCiNkZXYub2ZmKCkKCiNwZGYoZmlsZSA9ICdmaWdzL2ttbG9vc3RhdHNfWV9sZXZlbDFhLnBkZicsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEyKQpmb3IoaSBpbiAxOmxlbmd0aChsb29saXN0X2ttX1lfbGV2ZWwxYSkpewogIAogIHkgPC0gWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRbLCBpXQogIGxvbyA8LSBsb29saXN0X2ttX1lfbGV2ZWwxYV93YXZlMDFbW2ldXQogIHlsaW0gPC0gcmFuZ2UoYyhsb28kbWVhbiAtICgyKmxvbyRzZCksIGxvbyRtZWFuICsgKDIqbG9vJHNkKSkgKQogIHBsb3QoeSwgbG9vJG1lYW4sIHhsYWIgPSAnJywgeWxhYiA9ICcnLCBtYWluID0gJycgLCB5bGltID0geWxpbSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwgMTAwKSwKICAgICAgIHBjaCA9IDE5KQogIHNlZ21lbnRzKHgwID0geSwgeTAgPSBsb28kbWVhbiAtICgyKmxvbyRzZCkgICwgeDEgPSB5ICwgeTEgPSBsb28kbWVhbiArICgyKmxvbyRzZCksIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsIDEwMCkpCiAgYWJsaW5lKDAsMSkKICBsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSBjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKVtpXSwgYnR5ID0gJ24nLCB0ZXh0LmZvbnQgPSAyICApCiAgbGVnZW5kKCdib3R0b21yaWdodCcsbGVnZW5kID0gcGFzdGUoJ3BtYWUgPScscm91bmQobG9vc3RhdHNfa21fWV9sZXZlbDFhX3dhdmUwMVtbaV1dJHBtYWUsMiksJyUnKSAsIGJ0eSA9ICduJywgdGV4dC5mb250ID0gMikKCn0KCm10ZXh0KCdBY3R1YWwnLCBzaWRlID0gMSwgbGluZSA9IDEsIG91dGVyID0gVFJVRSwgY2V4ID0gMiApCm10ZXh0KCdQcmVkaWN0ZWQnLCBzaWRlID0gMiwgbGluZSA9IDAsIG91dGVyID0gVFJVRSwgY2V4ID0gMikgCm10ZXh0KCdMZXZlbCAxYSBlbnNlbWJsZSBvdXRwdXRzJywgc2lkZSA9IDMsIGxpbmUgPSAwLCBvdXRlciA9IFRSVUUsIGNleCA9IDIpCgpgYGAKCmBgYHtyfQojIHJlbW92ZSB0byBsZXZlbCAxYSBSZWxhdGl2ZSB0byB0b3BsZXZlbF9peCAtIHVzZWZ1bCBmb3IgcGxvdHRpbmcgZXRjLgojdG9wbGV2ZWxfdG9fbGV2ZWxfMWFfaXggPC0odG9wbGV2ZWxfaXhbLVlfbmxldmVsMF9peF0pW2xldmVsMWFfaXhdCgojIFNvIGZ1cnRoZXIgY29uc3RyYWluaW5nIHRvIGxldmVsIDIgY2FuIGJlIGFzc29jaWF0ZWQgYmFjayB0byB0aGUgdG9wIGxldmVsLgoKbGV2ZWwyX2l4IDwtIHdoaWNoKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCduYnBfbG5kX3N1bSddID4gMCAmCiAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ25wcF9ubGltX2xuZF9zdW0nXSA+IDM1ICYgIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10gPCA4MCAmCiAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NTb2lsX2xuZF9zdW0nXSA+IDc1MCAmIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10gPCAzMDAwICYKICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NWZWdfbG5kX3N1bSddID4gMzAwICYgWV9jb25zdF9sZXZlbDFhX3NjYWxlZFssJ2NWZWdfbG5kX3N1bSddIDwgODAwCiAgICAgICAgICAgICAgICAgIAogICkKCmxldmVsMl9peF9sZXZlbDFhX3dhdmUwMSA8LSB3aGljaChZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZFssJ25icF9sbmRfc3VtJ10gPiAwICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZFssJ25wcF9ubGltX2xuZF9zdW0nXSA+IDM1ICYgWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRbLCducHBfbmxpbV9sbmRfc3VtJ10gPCA4MCAmCiAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRbLCdjU29pbF9sbmRfc3VtJ10gPiA3NTAgJiBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZFssJ2NTb2lsX2xuZF9zdW0nXSA8IDMwMDAgJgogICAgICAgICAgICAgICAgICBZX2NvbnN0X2xldmVsMWFfd2F2ZTAxX3NjYWxlZFssJ2NWZWdfbG5kX3N1bSddID4gMzAwICYgWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRbLCdjVmVnX2xuZF9zdW0nXSA8IDgwMAogICAgICAgICAgICAgICAgICApCgpgYGAKCiMjIEVtdWxhdG9yIGFjY3VyYWN5IG9mIG1lbWJlcnMgZnJvbSB3YXZlIDAwIGFuZCB3YXZlIDAxIHRoYXQgcGFzcyBsZXZlbCAyIChBVydzKSBjb25zdHJhaW50cwoKV2Ugc2VlIHRoYXQgdGhlIGVycm9yIHN0YXRzIGZvciBzb21lIG9mIHRoZSBvdXRwdXRzIGZyb20gd2F2ZTAxIGFyZSB3b3JzZSwgYnV0IHRoZXJlIGFyZSBtYW55IG1vcmUgZW5zZW1ibGUgbWVtYmVycyB0aGF0IGxpZSB3aXRoaW4gdGhlIGNvbnN0cmFpbnRzIGZvciB3YXZlIDAxLgoKInBtYWUiIGlzICJwcm9wb3J0aW9uYWwgbWVhbiBhYnNvbHVlIGVycm9yIiwgd2hpY2ggaXMgdGhlIG1lYW4gYWJzb2x1dGUgZXJyb3IgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgb3JpZ2luYWwgKG1pbmltYWxseSBjb25zdHJhaW5lZCkgZW5zZW1ibGUgcmFuZ2UgaW4gdGhhdCBvdXRwdXQuIAoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gNn0KCiNwZGYoZmlsZSA9ICdmaWdzL2ttbG9vc3RhdHNfWV9sZXZlbDFhLnBkZicsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEyKQpwYXIobWZyb3cgPSBjKDIsNCksIG1hciA9IGMoMyw0LDIsMiksIG9tYSA9IGMoNCw0LDQsMC4xKSkKZm9yKGkgaW4gMTpsZW5ndGgobG9vbGlzdF9rbV9ZX2xldmVsMWEpKXsKICAKICB5IDwtIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbbGV2ZWwyX2l4LCBpXQogIGxvbyA8LSBsb29saXN0X2ttX1lfbGV2ZWwxYVtbaV1dCiAgeWxpbSA8LSByYW5nZShjKGxvbyRtZWFuW2xldmVsMl9peF0gLSAoMipsb28kc2RbbGV2ZWwyX2l4XSksIGxvbyRtZWFuW2xldmVsMl9peF0gKyAoMipsb28kc2RbbGV2ZWwyX2l4XSkpICkKICBwbG90KHksIGxvbyRtZWFuW2xldmVsMl9peF0sIHhsYWIgPSAnJywgeWxhYiA9ICcnLCBtYWluID0gJycgLCB5bGltID0geWxpbSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwgMTAwKSwKICAgICAgIHBjaCA9IDE5KQogIHNlZ21lbnRzKHgwID0geSwgeTAgPSBsb28kbWVhbltsZXZlbDJfaXhdIC0gKDIqbG9vJHNkW2xldmVsMl9peF0pICAsIHgxID0geSAsIHkxID0gbG9vJG1lYW5bbGV2ZWwyX2l4XSArICgyKmxvbyRzZFtsZXZlbDJfaXhdKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwgMTAwKSkKICBhYmxpbmUoMCwxKQogIGxlZ2VuZCgndG9wbGVmdCcsIGxlZ2VuZCA9IGNvbG5hbWVzKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpW2ldLCBidHkgPSAnbicsIHRleHQuZm9udCA9IDIgICkKICBsZWdlbmQoJ2JvdHRvbXJpZ2h0JyxsZWdlbmQgPSBwYXN0ZSgncG1hZSA9Jyxyb3VuZChsb29zdGF0c19rbV9ZX2xldmVsMWFbW2ldXSRwbWFlLDIpLCclJykgLCBidHkgPSAnbicsIHRleHQuZm9udCA9IDIpCgp9CgojZGV2Lm9mZigpCgojcGRmKGZpbGUgPSAnZmlncy9rbWxvb3N0YXRzX1lfbGV2ZWwxYS5wZGYnLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMikKZm9yKGkgaW4gMTpsZW5ndGgobG9vbGlzdF9rbV9ZX2xldmVsMWEpKXsKICAKICB5IDwtIFlfY29uc3RfbGV2ZWwxYV93YXZlMDFfc2NhbGVkW2xldmVsMl9peF9sZXZlbDFhX3dhdmUwMSwgaV0KICBsb28gPC0gbG9vbGlzdF9rbV9ZX2xldmVsMWFfd2F2ZTAxW1tpXV0KICB5bGltIDwtIHJhbmdlKGMobG9vJG1lYW5bbGV2ZWwyX2l4X2xldmVsMWFfd2F2ZTAxXSAtICgyKmxvbyRzZFtsZXZlbDJfaXhfbGV2ZWwxYV93YXZlMDFdKSwgbG9vJG1lYW5bbGV2ZWwyX2l4X2xldmVsMWFfd2F2ZTAxXSArICgyKmxvbyRzZFtsZXZlbDJfaXhfbGV2ZWwxYV93YXZlMDFdKSkgKQogIHBsb3QoeSwgbG9vJG1lYW5bbGV2ZWwyX2l4X2xldmVsMWFfd2F2ZTAxXSwgeGxhYiA9ICcnLCB5bGFiID0gJycsIG1haW4gPSAnJyAsIHlsaW0gPSB5bGltLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLCAxMDApLAogICAgICAgcGNoID0gMTkpCiAgc2VnbWVudHMoeDAgPSB5LCB5MCA9IGxvbyRtZWFuW2xldmVsMl9peF9sZXZlbDFhX3dhdmUwMV0gLSAoMipsb28kc2RbbGV2ZWwyX2l4X2xldmVsMWFfd2F2ZTAxXSkgICwgeDEgPSB5ICwgeTEgPSBsb28kbWVhbltsZXZlbDJfaXhfbGV2ZWwxYV93YXZlMDFdICsgKDIqbG9vJHNkW2xldmVsMl9peF9sZXZlbDFhX3dhdmUwMV0pLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLCA1MCkpCiAgYWJsaW5lKDAsMSkKICBsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSBjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKVtpXSwgYnR5ID0gJ24nLCB0ZXh0LmZvbnQgPSAyICApCiAgbGVnZW5kKCdib3R0b21yaWdodCcsbGVnZW5kID0gcGFzdGUoJ3BtYWUgPScscm91bmQobG9vc3RhdHNfa21fWV9sZXZlbDFhX3dhdmUwMVtbaV1dJHBtYWUsMiksJyUnKSAsIGJ0eSA9ICduJywgdGV4dC5mb250ID0gMikKCn0KCm10ZXh0KCdBY3R1YWwnLCBzaWRlID0gMSwgbGluZSA9IDEsIG91dGVyID0gVFJVRSwgY2V4ID0gMiApCm10ZXh0KCdQcmVkaWN0ZWQnLCBzaWRlID0gMiwgbGluZSA9IDAsIG91dGVyID0gVFJVRSwgY2V4ID0gMikgCm10ZXh0KCdMZXZlbCAyIGNvbnN0cmFpbmVkIGVuc2VtYmxlIG91dHB1dHMnLCBzaWRlID0gMywgbGluZSA9IDAsIG91dGVyID0gVFJVRSwgY2V4ID0gMikKCmBgYAoKIyMgRG9lcyB0aGUgZW11bGF0b3IgaW1wcm92ZSBpcyB5b3UgbG9vayBhdCBvbmx5IHRoZSAzNyBtZW1iZXJzIHRoYXQgcGFzcyBsZXZlbCAyIGNvbnN0cmFpbnRzIGluIHdhdmUgMDA/ClRoaXMgZ2l2ZXMgdXMgYW4gaWRlYSBvZiBob3cgZ29vZCB0aGUgZW11bGF0b3IgaXMgd2hlcmUgaXQgcmVhbGx5IG1hdHRlcnMsIGFuZCBhcyB0aGUgbWVtYmVycyBhcmUgY29uc2lzdGVudCwgZ2l2ZXMgdXMgYSBmYWlyZXIgaWRlYSBvZiB3aGV0aGVyIHRoZSBlbXVsYXRvcnMgaGF2ZSBpbXByb3ZlZCB3aXRoIG1vcmUgbWVtYmVycy4KCkdvb2QgbmV3cyBpcywgdGhlIGVtdWxhdG9ycyBhcmUgbW9yZSBhY2N1cmF0ZSBmb3Igd2F2ZTAxLgoKYGBge3J9CgoKa21Mb29TdGF0c1N1YnNldCA8LSBmdW5jdGlvbiAoa20sIGl4LCB0eXBlID0gIlVLIikgCnsKICAjIENhbGN1bGF0ZSBzdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIGEgc3Vic2V0IG9mIHRoZSBtZW1iZXJzIG9mIGEga20gZml0IGxpc3QKICAgIGxvbyA8LSBsZWF2ZU9uZU91dC5rbShrbSwgdHlwZSA9IHR5cGUsIHRyZW5kLnJlZXN0aW0gPSBUUlVFKQogICAgcHJlZGRpZmYgPC0gbG9vJG1lYW5baXhdIC0ga21AeVtpeF0KICAgIG1hZSA8LSBtZWFuKGFicyhwcmVkZGlmZikpCiAgICBybXNlIDwtIHNxcnQobWVhbihwcmVkZGlmZl4yKSkKICAgIG1heGVyciA8LSBtYXgocHJlZGRpZmYpCiAgICBhYnNkaWZmIDwtIGFicyhkaWZmKHJhbmdlKGttQHkpKSkKICAgIHBtYWUgPC0gKG1hZS9hYnNkaWZmKSAqIDEwMAogICAgcmV0dXJuKGxpc3QobG9vID0gbG9vLCBtYWUgPSBtYWUsIHBtYWUgPSBwbWFlLCBtYXhlcnIgPSBtYXhlcnIpKQp9CgoKYGBgCgoKYGBge3J9Cgpsb29saXN0X2ttX1lfbGV2ZWwxYV9sZXZlbDIgPC0gcmFwcGx5KGxvb2xpc3Rfa21fWV9sZXZlbDFhLCBmID0gZnVuY3Rpb24oeCkgeFtsZXZlbDJfaXhdLCBob3cgPSAibGlzdCIpCgpsb29saXN0X2ttX1lfbGV2ZWwxYV93YXZlMDFfbGV2ZWwyIDwtIHJhcHBseShsb29saXN0X2ttX1lfbGV2ZWwxYV93YXZlMDEsIGYgPSBmdW5jdGlvbih4KSB4W2xldmVsMl9peF0sIGhvdyA9ICJsaXN0IikKCgpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQoKI3BkZihmaWxlID0gJ2ZpZ3Mva21sb29zdGF0c19ZX2xldmVsMWEucGRmJywgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTIpCnBhcihtZnJvdyA9IGMoMiwyKSwgbWFyID0gYygzLDQsMiwyKSwgb21hID0gYyg0LDQsNCwwLjEpKQpmb3IoaSBpbiAxOmxlbmd0aChsb29saXN0X2ttX1lfbGV2ZWwxYV9sZXZlbDIpKXsKICAKICB5IDwtIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbbGV2ZWwyX2l4LCBpXQogIAogIGxvbyA8LSBsb29saXN0X2ttX1lfbGV2ZWwxYV9sZXZlbDJbW2ldXQogIHlsaW0gPC0gcmFuZ2UoYyhsb28kbWVhbi0gKDIqbG9vJHNkKSwgbG9vJG1lYW4gKyAoMipsb28kc2QpKSApCiAgcGxvdCh5LCBsb28kbWVhbiwgeGxhYiA9ICcnLCB5bGFiID0gJycsIG1haW4gPSAnJyAsIHlsaW0gPSB5bGltLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLCAyNTApLAogICAgICAgcGNoID0gMTkpCiAgYXJyb3dzKHgwID0geSwgeTAgPSBsb28kbWVhbiAtICgyKmxvbyRzZCkgICwgeDEgPSB5ICwgeTEgPSBsb28kbWVhbiArICgyKmxvbyRzZCksIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsIDE1MCkgLCAgYW5nbGUgPSA5MCwgY29kZSA9IDMsIGxlbmd0aCA9IDAuMDMpCiAgCiAgeTEgPC0gWV9jb25zdF9sZXZlbDFhX3dhdmUwMV9zY2FsZWRbbGV2ZWwyX2l4LCBpXQogIGxvbyA8LSBsb29saXN0X2ttX1lfbGV2ZWwxYV93YXZlMDFfbGV2ZWwyW1tpXV0KICAKICAgIHBvaW50cyh5MSwgbG9vJG1lYW4sIHhsYWIgPSAnJywgeWxhYiA9ICcnLCBtYWluID0gJycgLCB5bGltID0geWxpbSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwgMjUwKSwKICAgICAgIHBjaCA9IDE5KQogIGFycm93cyh4MCA9IHksIHkwID0gbG9vJG1lYW4gLSAoMipsb28kc2QpICAsIHgxID0geSAsIHkxID0gbG9vJG1lYW4gKyAoMipsb28kc2QpLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLCAyNTApLCAgYW5nbGUgPSA5MCwgY29kZSA9IDMsIGxlbmd0aCA9IDAuMDMpCiAgCiAgCiAgYWJsaW5lKDAsMSkKICBsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSBjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKVtpXSwgYnR5ID0gJ24nLCB0ZXh0LmZvbnQgPSAyICApCiAgbGVnZW5kKCdib3R0b21yaWdodCcsbGVnZW5kID0gcGFzdGUoJ3BtYWUgPScscm91bmQobG9vc3RhdHNfa21fWV9sZXZlbDFhW1tpXV0kcG1hZSwyKSwnJScpICwgYnR5ID0gJ24nLCB0ZXh0LmZvbnQgPSAyKQoKfQoKbXRleHQoJ0FjdHVhbCcsIHNpZGUgPSAxLCBsaW5lID0gMSwgb3V0ZXIgPSBUUlVFLCBjZXggPSAyICkKbXRleHQoJ1ByZWRpY3RlZCcsIHNpZGUgPSAyLCBsaW5lID0gMCwgb3V0ZXIgPSBUUlVFLCBjZXggPSAyKSAKbXRleHQoJ0xldmVsIDIgd2F2ZSAwMCBlbnNlbWJsZSBvdXRwdXRzJywgc2lkZSA9IDMsIGxpbmUgPSAwLCBvdXRlciA9IFRSVUUsIGNleCA9IDIpCgpyZXNldCgpCmxlZ2VuZCgndG9wbGVmdCcsIHBjaCA9IDE5LCBsZWdlbmQgPSBjKCd3YXZlMDAnLCAnd2F2ZTAxJyksIGNvbCA9IGMod2F2ZTAwY29sLCB3YXZlMDFjb2wgKSwgaG9yaXogPSBUUlVFKQoKCmBgYAoKVGhlc2UgbGVhdmUtb25lLW91dCBwcmVkaWN0aW9uIGFjY3VyYWN5IHBsb3RzIHJhbmsgdGhlIGVuc2VtYmxlIG1lbWJlcnMgZnJvbSBsYXJnZXN0IHVuZGVycHJlZGljdGlvbiB0byBsYXJnZXN0IG92ZXJwcmVkaWN0aW9uIHVzaW5nIHRoZSB3YXZlMDAgcHJlZGljdGlvbnMuIEEgcGVyZmVjdCBwcmVkaWN0aW9uIHdvdWxkIGFwcGVhciBvbiB0aGUgaG9yaXpvbnRhbCAiemVybyIgbGluZS4KCk1hbnkgb2YgdGhlIHdhdmUwMSBwcmVkaWN0aW9ucyBhcmUgY2xvc2VyIHRvIHRoZSBob3Jpem9udGFsIGxpbmUsIGFuZCB0aGVyZWZvcmUgbW9yZSBhY2N1cmF0ZSBwcmVkaWN0aW9ucy4gIAoKTm9uZSBvZiB0aGUgcHJlZGljdGlvbnMgYXJlIG91dHNpZGUgdGhlIHVuY2VydGFpbnR5IGJvdW5kcywgd2hpY2ggc3VnZ2VzdHMgdGhleSBhcmUgb3ZlcmNvbnNlcnZhdGl2ZSAoc2hvdWxkIGJlIHNtYWxsZXIpLgoKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwfQoKI3BkZihmaWxlID0gJ2ZpZ3Mva21sb29zdGF0c19ZX2xldmVsMWEucGRmJywgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTIpCnBhcihtZnJvdyA9IGMoNCwxKSwgbWFyID0gYygzLDQsMiwyKSwgb21hID0gYyg0LDQsNCwwLjEpKQpmb3IoaSBpbiAxOmxlbmd0aChsb29saXN0X2ttX1lfbGV2ZWwxYV9sZXZlbDIpKXsKICAKICB5IDwtIFlfY29uc3RfbGV2ZWwxYV9zY2FsZWRbbGV2ZWwyX2l4LCBpXQoKICBsb29fMDAgPC0gbG9vbGlzdF9rbV9ZX2xldmVsMWFfbGV2ZWwyW1tpXV0KICBsb29fMDEgPC0gbG9vbGlzdF9rbV9ZX2xldmVsMWFfd2F2ZTAxX2xldmVsMltbaV1dCiAgCiAgcHJlZGRpZmZfd2F2ZTAwIDwtIHkgLSBsb29fMDAkbWVhbgogIHByZWRkaWZmX3dhdmUwMSA8LSB5IC0gbG9vXzAxJG1lYW4KICAKICAgICMgcmFuayBieSB0aGUgb3JpZ2luYWwgd2F2ZSAwMCBwcmVkaWN0aW9ucwogIGxvb19yYW5rX2l4IDwtIHNvcnQocHJlZGRpZmZfd2F2ZTAwICwgaW5kZXgucmV0dXJuID0gVFJVRSkKICAKICAgeWxpbSA8LSByYW5nZShjKHByZWRkaWZmX3dhdmUwMFtsb29fcmFua19peCRpeF0gLSAoMipsb29fMDAkc2RbbG9vX3JhbmtfaXgkaXhdKSwKICAgICAgICAgICAgICAgICAgIHByZWRkaWZmX3dhdmUwMFtsb29fcmFua19peCRpeF0gKyAoMipsb29fMDAkc2RbbG9vX3JhbmtfaXgkaXhdKSwKICAgICAgICAgICAgICAgICAgIHByZWRkaWZmX3dhdmUwMVtsb29fcmFua19peCRpeF0gLSAoMipsb29fMDEkc2RbbG9vX3JhbmtfaXgkaXhdKSwKICAgICAgICAgICAgICAgICAgIHByZWRkaWZmX3dhdmUwMVtsb29fcmFua19peCRpeF0gKyAoMipsb29fMDEkc2RbbG9vX3JhbmtfaXgkaXhdKQogICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICkKICAgCiAgIHBsb3QocHJlZGRpZmZfd2F2ZTAwW2xvb19yYW5rX2l4JGl4XSwgeGxhYiA9ICcnLCB5bGFiID0gJycsIG1haW4gPSAnJyAsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsIDI1NSksCiAgICAgICAgcGNoID0gMTksIHlsaW0gPSB5bGltKQogICAKICAgYWJsaW5lKGggPSAwKQogICAKICBhcnJvd3MoeDAgPSAxOmxlbmd0aCh5KSwgeTAgPSBwcmVkZGlmZl93YXZlMDBbbG9vX3JhbmtfaXgkaXhdIC0gKDIqbG9vXzAwJHNkW2xvb19yYW5rX2l4JGl4XSkgICwgeDEgPSAxOmxlbmd0aCh5KSAsIHkxID0gcHJlZGRpZmZfd2F2ZTAwW2xvb19yYW5rX2l4JGl4XSArICgyKmxvb18wMCRzZFtsb29fcmFua19peCRpeF0pLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLCAxNTApLCAgYW5nbGUgPSA5MCwgY29kZSA9IDMsIGxlbmd0aCA9IDAuMDMpCiAgIAogIHBvaW50cyhwcmVkZGlmZl93YXZlMDFbbG9vX3JhbmtfaXgkaXhdLCB4bGFiID0gJycsIHlsYWIgPSAnJywgbWFpbiA9ICcnICwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMWNvbCwgMjU1KSwKICAgICAgICBwY2ggPSAxOSkKICAKICAgIGFycm93cyh4MCA9IDE6bGVuZ3RoKHkpLCB5MCA9IHByZWRkaWZmX3dhdmUwMVtsb29fcmFua19peCRpeF0gLSAoMipsb29fMDEkc2RbbG9vX3JhbmtfaXgkaXhdKSAgLCB4MSA9IDE6bGVuZ3RoKHkpICwgeTEgPSBwcmVkZGlmZl93YXZlMDFbbG9vX3JhbmtfaXgkaXhdICsgKDIqbG9vXzAxJHNkW2xvb19yYW5rX2l4JGl4XSksIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsIDE1MCksIGFuZ2xlID0gOTAsIGNvZGUgPSAzLCBsZW5ndGggPSAwLjAzKQogICAKICAgbXRleHQoY29sbmFtZXMoWV9jb25zdF9sZXZlbDFhX3NjYWxlZClbaV0sIHNpZGUgPSAzLCBhZGogPSAwLCBsaW5lID0gMSkKICAKCn0KCgogcmVzZXQoKQogbGVnZW5kKCd0b3BsZWZ0JywgcGNoID0gMTksIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsICd3YXZlMDEnKSwgY29sID0gYyh3YXZlMDBjb2wsIHdhdmUwMWNvbCApLCBob3JpeiA9IFRSVUUpCgpgYGAKCgpgYGB7cn0KCmxvb3N0YXRzX2ttX1lfbGV2ZWwxYV9zdWIgPC0gbGFwcGx5KGZpdF9saXN0X2NvbnN0X2xldmVsMWEsIEZVTiA9IGttTG9vU3RhdHNTdWJzZXQsIGl4ID0gbGV2ZWwyX2l4KQpsb29zdGF0c19rbV9ZX2xldmVsMWFfd2F2ZTAxX3N1YiA8LSBsYXBwbHkoZml0X2xpc3RfY29uc3RfbGV2ZWwxYV93YXZlMDEsIEZVTiA9IGttTG9vU3RhdHNTdWJzZXQsIGl4ID0gbGV2ZWwyX2l4KQoKYGBgCgpMb29raW5nIGF0IHRoZSBwcm9wb3J0aW9uYWwgbWVhbiBhYnNvbHV0ZSBlcnJvciAocG1hZSksIGV4cHJlc3NlZCBpbiBwZXJjZW50LCB3ZSBjYW4gc2VlIHRoYXQgaXQgZG9lc24ndCBpbXByb3ZlIG11Y2ggZm9yIHRoZSB3aG9sZSBlbnNlbWJsZSwgYnV0ICpkb2VzKiBpbXByb3ZlIHNpZ25pZmljYW50bHkgZm9yIHRoZSBzdWJzZXQgb2YgZW5zZW1ibGUgbWVtYmVycyB0aGF0IGZhbGwgd2l0aGluIEFXJ3MgY29uc3RyYWludHMgZnJvbSB0aGUgZmlyc3QgZW5zZW1ibGUgKG1hcmtlZCAiX3N1YiIpLgoKYGBge3IsIGVjaG8gPSBUUlVFfQoKcG1hZV93YXZlMDAgPC0gbGFwcGx5KGxvb3N0YXRzX2ttX1lfbGV2ZWwxYSwgRlVOID0gZnVuY3Rpb24oeCkgeCRwbWFlICkKcG1hZV93YXZlMDEgPC0gbGFwcGx5KGxvb3N0YXRzX2ttX1lfbGV2ZWwxYV93YXZlMDEsIEZVTiA9IGZ1bmN0aW9uKHgpIHgkcG1hZSApCgpwbWFlX3dhdmUwMF9zdWIgPC0gbGFwcGx5KGxvb3N0YXRzX2ttX1lfbGV2ZWwxYV9zdWIsIEZVTiA9IGZ1bmN0aW9uKHgpIHgkcG1hZSApCnBtYWVfd2F2ZTAxX3N1YiA8LSBsYXBwbHkobG9vc3RhdHNfa21fWV9sZXZlbDFhX3dhdmUwMV9zdWIsIEZVTiA9IGZ1bmN0aW9uKHgpIHgkcG1hZSApCgpwbWFlX3RhYmxlIDwtIGNiaW5kKHBtYWVfd2F2ZTAwLCBwbWFlX3dhdmUwMSwgcG1hZV93YXZlMDBfc3ViLCBwbWFlX3dhdmUwMV9zdWIpCgpwcmludChwbWFlX3RhYmxlKQoKYGBgCgojIENvbXBhcmluZyBhdG1vc3BoZXJpYyBncm93dGggaW4gd2F2ZTAwLCB3YXZlMDEgYW5kIG9ic2VydmF0aW9ucwoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0KaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0IDwtIHJlYWRfZXhjZWwoJ0dsb2JhbF9DYXJib25fQnVkZ2V0XzIwMjB2MS4wLnhsc3gnLCBzaGVldCA9ICJIaXN0b3JpY2FsIEJ1ZGdldCIsIHNraXAgPSAxNSwgbl9tYXggPSAyNzApCgpyZXNpZCA8LSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYG9jZWFuIHNpbmtgIC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBmb3NzaWwgZW1pc3Npb25zIGV4Y2x1ZGluZyBjYXJib25hdGlvbmAKCnJlc2lkX2l4IDwtIHdoaWNoKGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRZZWFyICVpbiUgeWVhcnMpCgpuZWdfYWcgPC0gc3dlZXAobmJwX2VucywgMiwgcmVzaWRbcmVzaWRfaXhdLCBGVU4gPSAnKycpCgoKbWF0cGxvdCh5ZWFycywgdCgtbmVnX2FnKSwgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJyx5bGltID0gYygwLCA4KSwgY29sID0gd2F2ZTAwY29sLCAKICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2F0bW9zcGhlcmljIGdyb3d0aCcsIHhsYWIgPSAnJywKICAgICAgICAgYnR5ID0gJ24nLCB4bGltID0gYygxOTYwLCAyMDIwKSkKCmxpbmVzKGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRZZWFyLCBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGF0bW9zcGhlcmljIGdyb3d0aGAsIGNvbCA9ICdyZWQnKQoKCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDh9CgpvYnNjb2wgPSAncHVycGxlJwp3YXZlMDFfbGV2ZWwyY29sIDwtICdnb2xkJwoKYWcgPC0gbWF0cml4KG5yb3cgPSBucm93KG5icF9lbnMpLCBuY29sID0gbmNvbChuYnBfZW5zKSkKCmFnMDEgPC0gbWF0cml4KG5yb3cgPSBucm93KG5icF9lbnNfd2F2ZTAxKSwgbmNvbCA9IG5jb2wobmJwX2Vuc193YXZlMDEpKQoKZm9yKGkgaW4gMTpucm93KG5icF9lbnMpKXsKICAKYWdbaSwgXSA8LSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYGZvc3NpbCBlbWlzc2lvbnMgZXhjbHVkaW5nIGNhcmJvbmF0aW9uYFtyZXNpZF9peF0gLSBoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkYG9jZWFuIHNpbmtgW3Jlc2lkX2l4XSAtICBuYnBfZW5zW2ksIF0KICAKfQoKCmZvcihpIGluIDE6bnJvdyhuYnBfZW5zX3dhdmUwMSkpewphZzAxW2ksIF0gPC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBmb3NzaWwgZW1pc3Npb25zIGV4Y2x1ZGluZyBjYXJib25hdGlvbmBbcmVzaWRfaXhdIC0gaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JGBvY2VhbiBzaW5rYFtyZXNpZF9peF0gLSAgbmJwX2Vuc193YXZlMDFbaSwgXQogIAp9CgphZ19zdGFuIDwtIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgZm9zc2lsIGVtaXNzaW9ucyBleGNsdWRpbmcgY2FyYm9uYXRpb25gW3Jlc2lkX2l4XSAtIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgb2NlYW4gc2lua2BbcmVzaWRfaXhdIC0gIG5icF9zdGFuCgojcGRmKHdpZHRoID0gOCwgaGVpZ2h0ID0gNiwgZmlsZSA9ICdhZy5wZGYnKQpwYXIobGFzID0gMSkKbWF0cGxvdCh5ZWFycywgdChhZ1t3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMCwgXSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IGMoLTIsIDEwKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwxMDApLCAKICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2F0bW9zcGhlcmljIGdyb3d0aCcsIHhsYWIgPSAnJywKICAgICAgICAgYnR5ID0gJ24nLCB4bGltID0gYygxOTYwLCAyMDEzKSkKCm1hdGxpbmVzKHllYXJzLCB0KGFnMDFbd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDEsIF0pLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAxY29sLDEwMCksIGx0eSA9ICdzb2xpZCcpCgptYXRsaW5lcyh5ZWFycywgdChhZzAxW2xldmVsMmFfaXhfd2F2ZTAxLCBdKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMV9sZXZlbDJjb2wsIDEwMCkgLCBsdHkgPSAnc29saWQnKQoKbGluZXMoaGlzdG9yaWNhbF9jYXJib25fYnVkZ2V0JFllYXIsIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgYXRtb3NwaGVyaWMgZ3Jvd3RoYCwgY29sID0gb2JzY29sLCBsd2QgPTIpCgpsaW5lcyh5ZWFycywgYWdfc3RhbiwgY29sID0gc3RhbmNvbCwgbHdkID0yKQoKCmxlZ2VuZCgndG9wbGVmdCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsICd3YXZlMDEnLCAnd2F2ZTAxIGNvbnN0cmFpbmVkJywgJ3N0YW5kYXJkJywgJ0dDQicpLCBjb2wgPSBjKHdhdmUwMGNvbCwgd2F2ZTAxY29sLCB3YXZlMDFfbGV2ZWwyY29sLCBzdGFuY29sLCBvYnNjb2wpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyKQojZGV2Lm9mZigpCgpgYGAKCgojIyBBbmR5IGFza3MgLSB3aGF0IGNvbnN0cmFpbnQgZG9lcyB0aGF0IGdpdmUgdXMgaW4gY3VtdWxhdGl2ZSBOQlA/CgpgYGB7ciwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDd9CgpjdW11bGF0aXZlX25icF9lbnMgPC0gdChhcHBseShuYnBfZW5zLCAxLCBjdW1zdW0pKQoKY3VtdWxhdGl2ZV9uYnBfZW5zX3dhdmUwMSA8LSB0KGFwcGx5KG5icF9lbnNfd2F2ZTAxLCAxLCBjdW1zdW0pKQoKY3VtdWxhdGl2ZV9uYnBfc3RhbiA8LSBjdW1zdW0obmJwX3N0YW4pCgptYXRwbG90KHllYXJzLCB0KGN1bXVsYXRpdmVfbmJwX2VucyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IGMoLTEzMCwgMjUwKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMGNvbCwxNTApLCAKICAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ2N1bXVsYXRpdmUgTkJQJywgeGxhYiA9ICcnLAogICAgICAgICBidHkgPSAnbicsIHhsaW0gPSBjKDE4NTAsIDIwMjApKQoKbWF0bGluZXMoeWVhcnMsIHQoY3VtdWxhdGl2ZV9uYnBfZW5zX3dhdmUwMSksCiAgICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFjb2wsMTUwKSwKICAgICAgICAgbHR5ID0gJ3NvbGlkJykKCm1hdGxpbmVzKHllYXJzLCB0KGN1bXVsYXRpdmVfbmJwX2Vuc193YXZlMDFbbGV2ZWwyX2l4X3dhdmUwMSwgXSksCiAgICAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDFfbGV2ZWwyY29sLCAxNTApLAogICAgICAgICBsdHkgPSAnc29saWQnKQoKCmxpbmVzKHllYXJzLCBjdW11bGF0aXZlX25icF9zdGFuLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoc3RhbmNvbCwgMjAwKSwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMS41ICkKCgpsZWdlbmQoJ3RvcGxlZnQnLCBsZWdlbmQgPSBjKCd3YXZlMDAnLCAnd2F2ZTAxJywgJ3dhdmUwMSBjb25zdHJhaW5lZCcsICdzdGFuZGFyZCcpLCBjb2wgPSBjKHdhdmUwMGNvbCwgd2F2ZTAxY29sLCB3YXZlMDFfbGV2ZWwyY29sLCBzdGFuY29sKSwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMS41KQoKYGBgCgojIyBFZGR5IHN1Z2dlc3RzIG1lYXN1cmluZyBjdW11bGF0aXZlIE5CUCBhZ2FpbnN0IGF0bW9zcGhlcmljIGdyb3d0aCByYXRlCgpgYGB7cn0KCiMgQ3VtdWxhdGl2ZSBOQlAgYXQgdGhlIGVuZCBvZiB0aGUgcnVuCmNuYnBfbW9kZXJuX2VucyA8LSBhcHBseShjdW11bGF0aXZlX25icF9lbnNbLCAxMzU6MTY0XSwgMSwgbWVhbikKCmNuYnBfbW9kZXJuX3dhdmUwMSA8LSBhcHBseShjdW11bGF0aXZlX25icF9lbnNfd2F2ZTAxWywgMTM1OjE2NF0sIDEsIG1lYW4pCgpjbmJwX21vZGVybl9zdGFuIDwtIG1lYW4oY3VtdWxhdGl2ZV9uYnBfc3RhblsxMzU6MTY0XSkKCgoKYGBgCgpDYWxjdWxhdGUgdGhlIGF0bW9zcGhlcmljIGdyb3d0aCByYXRlIG9mIDE5ODQtIDIwMTMgdXNpbmcgYSBzaW1wbGUgbGluZWFyIGZpdAoKYGBge3J9CiMgYWdyID0gYXRtb3NwaGVyaWMgZ3Jvd3RoIHJhdGUKIyBhZ2lhdiA9IGF0bW9zcGhlcmljIGdyb3d0aCBpbnRlcmFubnVhbCB2YXJpYWJpbGl0eQoKYWdyX21vZGVybl9lbnMgPC0gcmVwKE5BLCBsZW5ndGggPSBucm93KGFnKSkKYWdpYXZfbW9kZXJuX2VucyA8LSByZXAoTkEsIGxlbmd0aCA9IG5yb3coYWcpKQoKZm9yKGkgaW4gMTpucm93KGFnKSl7CiAgCiAgZGF0IDwtIGRhdGEuZnJhbWUodCA9MTozMCwgYWcgPSAgYWdbaSwgMTM1OjE2NF0pCiAgZml0IDwtIGxtKGFnIH4gdCwgZGF0YSA9IGRhdCkKICBhZ3JfbW9kZXJuX2Vuc1tpXSA8LSBjb2VmKGZpdClbJ3QnXQogIGFnaWF2X21vZGVybl9lbnNbaV0gPC0gc2QoZml0JHJlc2lkdWFscykKfQoKCmFncl9tb2Rlcm5fd2F2ZTAxIDwtIHJlcChOQSwgbGVuZ3RoID0gbnJvdyhhZzAxKSkKYWdpYXZfbW9kZXJuX3dhdmUwMSA8LSByZXAoTkEsIGxlbmd0aCA9IG5yb3coYWcwMSkpCgpmb3IoaSBpbiAxOm5yb3coYWcwMSkpewogIAogIGRhdCA8LSBkYXRhLmZyYW1lKHQgPTE6MzAsIGFnID0gIGFnMDFbaSwgMTM1OjE2NF0pCiAgZml0IDwtIGxtKGFnIH4gdCwgZGF0YSA9IGRhdCkKICBhZ3JfbW9kZXJuX3dhdmUwMVtpXSA8LSBjb2VmKGZpdClbJ3QnXQogIGFnaWF2X21vZGVybl93YXZlMDFbaV0gPC0gc2QoZml0JHJlc2lkdWFscykKfQoKZGF0IDwtIGRhdGEuZnJhbWUodCA9MTozMCwgYWcgPSAgYWdfc3RhblsxMzU6MTY0XSkKYWdyX3N0YW5fZml0IDwtIGxtKGFnIH4gdCwgZGF0YSA9IGRhdCkgCmFncl9zdGFuIDwtIGNvZWYoYWdyX3N0YW5fZml0KVsndCddCmFnaWF2X3N0YW4gPC0gc2QoYWdyX3N0YW5fZml0JHJlc2lkdWFscykKICAKICAKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDd9CgpwbG90KGFncl9tb2Rlcm5fZW5zLCBjbmJwX21vZGVybl9lbnMsICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLDE1MCksCiAgICAgeWxpbSA9IGMoLTEyMCwyMjApLCBwY2ggPSAxOSwKICAgICB4bGFiID0gJ0F0bW9zcGhlcmljIGdyb3d0aCByYXRlIDE5ODQtMjAxNCcsCiAgICAgeWxhYiA9ICdDdW11bGF0aXZlIE5CUCBmcm9tIHByZWluZHVzdHJpYWwgYnkgMTk4NC0yMDEzJwogICAgICkKCmNuYnBfd2F2ZTAxX2NvbHMgPC0gcmVwKHdhdmUwMWNvbCwgbGVuZ3RoKGNuYnBfbW9kZXJuX3dhdmUwMSkpCmNuYnBfd2F2ZTAxX2NvbHNbbGV2ZWwyX2l4X3dhdmUwMV0gPC0gd2F2ZTAxX2xldmVsMmNvbCAKCnBvaW50cyggYWdyX21vZGVybl93YXZlMDEsY25icF9tb2Rlcm5fd2F2ZTAxLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoY25icF93YXZlMDFfY29scywgMTUwKSwgcGNoID0gMTkpCnBvaW50cyggYWdyX3N0YW4sY25icF9tb2Rlcm5fc3RhbiwgY29sID0gc3RhbmNvbCwgcGNoID0gMTksIGNleCA9IDEuNSkKCmxlZ2VuZCgndG9wbGVmdCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMCcsICd3YXZlMDEnLCAnd2F2ZTAxIGNvbnN0cmFpbmVkJywgJ3N0YW5kYXJkJyksIGNvbCA9IGMod2F2ZTAwY29sLCB3YXZlMDFjb2wsIHdhdmUwMV9sZXZlbDJjb2wsIHN0YW5jb2wpLCBwY2ggPSAxOSkKCnByaW50KGMoJ2NvcnJlbGF0aW9uIGFnciB2cyBjbmJwIChhbGwgbWVtYmVycyknLCBjb3IoYWdyX21vZGVybl9lbnMsIGNuYnBfbW9kZXJuX2VucykpKQoKcHJpbnQoYygnY29ycmVsYXRpb24gYWdyIHZzIGNuYnAgKHdhdmUwMSknLCBjb3IoYWdyX21vZGVybl93YXZlMDEsIGNuYnBfbW9kZXJuX3dhdmUwMSkpKQoKZml0X3dhdmUwMCA8LSBsbShhZ3JfbW9kZXJuX2VucyB+IGNuYnBfbW9kZXJuX2VucykKZml0X3dhdmUwMSA8LSBsbShhZ3JfbW9kZXJuX3dhdmUwMSB+IGNuYnBfbW9kZXJuX3dhdmUwMSkKCnByaW50KHN1bW1hcnkoZml0X3dhdmUwMCkpCnByaW50KHN1bW1hcnkoZml0X3dhdmUwMSkpCgpgYGAKSW50ZXJhbm51YWwgdmFyaWFiaWxpdHkgYW5kIGN1bXVsYXRpdmUgTkJQICAKCihjb3JyZWxhdGlvbnMgYXJlIGNsb3NlIHRvIHplcm8sIGVzcGVjaWFsbHkgaW4gdGhlIGxhdGVyIHdhdmUpCgoKYGBge3IsIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA3fQoKcGxvdChhZ2lhdl9tb2Rlcm5fZW5zLCBjbmJwX21vZGVybl9lbnMsICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQod2F2ZTAwY29sLDE1MCksCiAgICAgeWxpbSA9IGMoLTEyMCwyMjApLCBwY2ggPSAxOSwKICAgICB4bGFiID0gJ0F0bW9zcGhlcmljIGdyb3d0aCBJQVYgMTk4NC0yMDE0JywKICAgICB5bGFiID0gJ0N1bXVsYXRpdmUgTkJQIGZyb20gcHJlaW5kdXN0cmlhbCBieSAxOTg0LTIwMTMnCiAgICAgKQoKcG9pbnRzKCBhZ2lhdl9tb2Rlcm5fd2F2ZTAxLCBjbmJwX21vZGVybl93YXZlMDEsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChjbmJwX3dhdmUwMV9jb2xzLCAxNTApLCBwY2ggPSAxOSkKcG9pbnRzKCBhZ2lhdl9zdGFuLGNuYnBfbW9kZXJuX3N0YW4sIGNvbCA9IHN0YW5jb2wsIHBjaCA9IDE5LCBjZXggPSAxLjUpCgpsZWdlbmQoJ2JvdHRvbXJpZ2h0JywgbGVnZW5kID0gYygnd2F2ZTAwJywgJ3dhdmUwMScsICd3YXZlMDEgY29uc3RyYWluZWQnLCAnc3RhbmRhcmQnKSwgY29sID0gYyh3YXZlMDBjb2wsIHdhdmUwMWNvbCwgd2F2ZTAxX2xldmVsMmNvbCwgc3RhbmNvbCksIHBjaCA9IDE5KQoKYGBgCgoKYGBge3J9CgoKcHJpbnQoY29yKGFnaWF2X21vZGVybl9lbnMsIGNuYnBfbW9kZXJuX2VucykpCnByaW50KGNvciggYWdpYXZfbW9kZXJuX3dhdmUwMSwgY25icF9tb2Rlcm5fd2F2ZTAxKSkKCmBgYAoKCiMjIEhvdyBjbG9zZSBjYW4gd2UgZ2V0IHRoZSBtb2RlbCB0byByZWFsaXR5PwoKVXNpbmcgQXRtb3NwaGVyaWMgR3Jvd3RoIFJhdGUgYXMgYW4gZXhhbXBsZSwgaG93IGNsb3NlIGNhbiB3ZSBnZXQgdGhlIG1vZGVsIHRvIG9ic2VydmF0aW9ucz8gQ2FuIHdlIGRvIGJldHRlciB0aGFuIHN0YW5kYXJkPyBXaGF0IGFyZSB0aGUgdHJhZGUgb2ZmcyBvZiBkb2luZyBzbz8gSG93IGRvZXMgZ2V0dGluZyBjbG9zZSBpbiBBR1IgYWZmZWN0IHBlcmZvcm1hbmNlIGluIG90aGVyIG91dHB1dHM/CgpgYGB7cn0KIyBEZWZpbmUgdGhlIG9ic2VydmVkIGF0bW9zcGhlcmljIGdyb3d0aCByYXRlLgoKYWdfb2JzIDwtIGhpc3RvcmljYWxfY2FyYm9uX2J1ZGdldCRgYXRtb3NwaGVyaWMgZ3Jvd3RoYFt3aGljaChoaXN0b3JpY2FsX2NhcmJvbl9idWRnZXQkWWVhciAlaW4lIHllYXJzKV0KCiMgTW9kZWwgZGVwYXJ0dXJlIGZyb20gb2JzZXJ2YXRpb25zIG9mIGF0bW9zcGhlcmljIGdyb3d0aAphZ19lcnIgPC0gc3dlZXAoYWcsIDIsIGFnX29icywgRlVOID0gJy0nKQphZzAxX2VyciA8LSBzd2VlcChhZzAxLCAyLCBhZ19vYnMsIEZVTiA9ICctJykKCgpsb25nX21vZGVybl95ZWFycyA8LSAxOTYwOjIwMTMKYWdfbW9kZXJuX2l4IDwtIHdoaWNoKCB5ZWFycyAlaW4lIGxvbmdfbW9kZXJuX3llYXJzKQoKYWdfZXJyX21vZGVybiA8LSBhZ19lcnJbLCBhZ19tb2Rlcm5faXhdCmFnMDFfZXJyX21vZGVybiA8LSBhZzAxX2VyclssIGFnX21vZGVybl9peF0KCgphZ19lcnJfc3RhbiA8LSBhZ19zdGFuIC0gYWdfb2JzCmFnX2Vycl9zdGFuX21vZGVybiA8LSBhZ19lcnJfc3RhblthZ19tb2Rlcm5faXhdCgpgYGAKCmBgYHtyfQptYXRwbG90KGxvbmdfbW9kZXJuX3llYXJzLCB0KGFnX2Vycl9tb2Rlcm5bd2l0aG91dF9vdXRsaWVyc19peF93YXZlMDAsXSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCh3YXZlMDBjb2wsIDEwMCksIG1haW4gPSAnQW1vc3BoZXJpYyBHcm93dGggRXJyb3InKQoKZXJyY29sIDwtIHJlcCh3YXZlMDFjb2wsIG5yb3coYWcwMVt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdKSkKI2VycmNvbFtsZXZlbDJfaXhfd2F2ZTAxXSA8LSB3YXZlMDFfbGV2ZWwyY29sCm1hdGxpbmVzKGxvbmdfbW9kZXJuX3llYXJzLCB0KGFnMDFfZXJyX21vZGVyblt3aXRob3V0X291dGxpZXJzX2l4X3dhdmUwMSxdKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KGVycmNvbCwgMTAwKSwgbHR5ID0gJ3NvbGlkJykKbWF0bGluZXMobG9uZ19tb2Rlcm5feWVhcnMsIHQoYWcwMV9lcnJfbW9kZXJuW2xldmVsMmFfaXhfd2F2ZTAxLCBdKSwgY29sID0gbWFrZVRyYW5zcGFyZW50KHdhdmUwMV9sZXZlbDJjb2wsMTAwKSwgbHR5ID0gJ3NvbGlkJykKCmxpbmVzKGxvbmdfbW9kZXJuX3llYXJzLCBhZ19lcnJfc3Rhbl9tb2Rlcm4sIGNvbCA9IHN0YW5jb2wpCgpsZWdlbmQoJ2JvdHRvbWxlZnQnLCBsZWdlbmQgPSBjKCd3YXZlMDAnLCAnd2F2ZTAxJywgJ3dhdmUwMSBjb25zdHJhaW5lZCcsICdzdGFuZGFyZCcpLCBjb2wgPSBjKHdhdmUwMGNvbCwgd2F2ZTAxY29sLCB3YXZlMDFfbGV2ZWwyY29sLCBzdGFuY29sKSwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMS41KQoKYWJsaW5lKGg9MCkKCmBgYAoKCmBgYHtyLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gN30KCiMgQXRtb3NwaGVyaWMgZ3Jvd3RoIG1lYW4gZXJyb3IKYWdfbW9kZXJuX21lIDwtIGFwcGx5KGFnX2Vycl9tb2Rlcm4sMSxtZWFuKQphZzAxX21vZGVybl9tZSA8LSBhcHBseShhZzAxX2Vycl9tb2Rlcm4sMSwgbWVhbikKYWdfbW9kZXJuX21lX3N0YW4gPC0gbWVhbihhZ19lcnJfc3RhblthZ19tb2Rlcm5faXhdKQoKCiMgTWVhbiBhYnNvbHV0ZSBlcnJvcgphZ19tb2Rlcm5fbWFlIDwtIGFwcGx5KGFicyhhZ19lcnJfbW9kZXJuKSwxLG1lYW4pCmFnMDFfbW9kZXJuX21hZSA8LSBhcHBseShhYnMoYWcwMV9lcnJfbW9kZXJuKSwxLCBtZWFuKQphZ19tb2Rlcm5fbWFlX3N0YW4gPC0gbWVhbihhYnMoYWdfZXJyX3N0YW5bYWdfbW9kZXJuX2l4XSkpCgoKCiMgUm9vdCBtZWFuIHNxdWFyZSBlcnJvcgphZ19tb2Rlcm5fcm1zZSA8LSBhcHBseShhZ19lcnJfbW9kZXJuLDEsIGZ1bmN0aW9uKHgpIHNxcnQobWVhbih4XjIpKSkKYWcwMV9tb2Rlcm5fcm1zZSA8LSBhcHBseShhZzAxX2Vycl9tb2Rlcm4sMSwgZnVuY3Rpb24oeCkgc3FydChtZWFuKHheMikpKQphZ19tb2Rlcm5fcm1zZV9zdGFuIDwtIHNxcnQobWVhbihhZ19lcnJfc3RhblthZ19tb2Rlcm5faXhdXjIpKQoKIyBUaGVyZSBhcmUgc29tZSBiaWcgb3V0bGllcnMgCm91dGxpZXJfaXhfd2F2ZTAxIDwtIHdoaWNoKGFicyhhZzAxX21vZGVybl9tZSApPiAxMDApCgpwYXIobWZyb3cgPSBjKDIsMSkpCmhpc3QoYWdfbW9kZXJuX21lLCBtYWluID0gJ0F0bW9zcGhlcmljIGdyb3d0aCBtZWFuIGVycm9yJywgY29sID0gd2F2ZTAwY29sLCB4bGltID0gYygtMywgMykpCnJ1ZyhhZ19tb2Rlcm5fbWVfc3RhbiwgY29sID0gc3RhbmNvbCwgbHdkID0gMikKaGlzdChhZzAxX21vZGVybl9tZVstb3V0bGllcl9peF93YXZlMDFdLCBjb2wgPSB3YXZlMDFjb2wsIHhsaW0gPSBjKC0zLDMpLCBtYWluID0gJycpCnJ1ZyhhZ19tb2Rlcm5fbWVfc3RhbiwgY29sID0gc3RhbmNvbCwgbHdkID0gMikKCnBhcihtZnJvdyA9IGMoMiwxKSkKaGlzdChhZ19tb2Rlcm5fbWFlLCBtYWluID0gJ0F0bW9zcGhlcmljIGdyb3d0aCBtZWFuIGFic29sdXRlIGVycm9yJywgY29sID0gd2F2ZTAwY29sLCB4bGltID0gYygwLCAzKSkKcnVnKGFnX21vZGVybl9tYWVfc3RhbiwgY29sID0gc3RhbmNvbCwgbHdkID0gMikKaGlzdChhZzAxX21vZGVybl9tYWVbLW91dGxpZXJfaXhfd2F2ZTAxXSwgY29sID0gd2F2ZTAxY29sLCBsd2QgPSAyLCB4bGltID0gYygwLDMpLCBtYWluID0gJycpCnJ1ZyhhZ19tb2Rlcm5fbWFlX3N0YW4sIGNvbCA9IHN0YW5jb2wsIGx3ZCA9IDIpCgpwYXIobWZyb3cgPSBjKDIsMSkpCmhpc3QoYWdfbW9kZXJuX3Jtc2UsIHhsaW0gPSBjKDAsMyksIGNvbCA9IHdhdmUwMGNvbCwgbWFpbiA9ICdBdG1vc3BoZXJpYyBncm93dGggUk1TRScpCnJ1ZyhhZ19tb2Rlcm5fcm1zZV9zdGFuLCBjb2wgPSBzdGFuY29sLCBsd2QgPSAyICkKaGlzdChhZzAxX21vZGVybl9ybXNlWy1vdXRsaWVyX2l4X3dhdmUwMV0sIGNvbCA9IHdhdmUwMWNvbCwgeGxpbSA9IGMoMCwzKSwgbWFpbiA9ICcnKQpydWcoYWdfbW9kZXJuX3Jtc2Vfc3RhbiwgY29sID0gc3RhbmNvbCwgbHdkID0gMiApCgoKCmBgYAoKCldlJ3ZlIGVzdGFibGlzaGVkIHRoYXQgbW9zdCBvZiB0aGUgb3JpZ2luYWwgZW5zZW1ibGUgaGF2ZSBhbiBNRS9NQUUvUk1TRSBsYXJnZXIgdGhhbiB0aGUgc3RhbmRhcmQgcnVuLiBNb3JlIChidXQgZmV3KSBvZiB0aGUgd2F2ZTAxIHBlcmZvcm0gYmV0dGVyIHRoYW4gc3RhbmRhcmQuIAoKYGBge3J9CgoKYmV0dGVyX2l4X2FnX3Jtc2UgPC0gd2hpY2goYWdfbW9kZXJuX3Jtc2UgPCBhZ19tb2Rlcm5fcm1zZV9zdGFuKQpiZXR0ZXJfaXhfYWcwMV9ybXNlIDwtIHdoaWNoKGFnMDFfbW9kZXJuX3Jtc2UgPCBhZ19tb2Rlcm5fcm1zZV9zdGFuKQoKClhfYmV0dGVyX2FnIDwtIHJiaW5kKFhbYmV0dGVyX2l4X2FnX3Jtc2UsIF0sIFhfd2F2ZTAxX3RyYWluW2JldHRlcl9peF9hZzAxX3Jtc2UsIF0pCgpgYGAKCgpBIG1hcCBvZiB0aGUgMkQgcHJvamVjdGlvbnMgb2YgcGFyYW1ldGVyIHNwYWNlIHdoZXJlIHRoZSBlbnNlbWJsZSBtZW1iZXIgcGVyZm9ybXMgYmV0dGVyIHRoYW4gc3RhbmRhcmQuICAKClRoZSBibHVlIHBhcnQgaXMgdGhlIGZpcnN0IHdhdmUsIGFuZCBub3Qgc3ViamVjdCB0byBjb25zdHJhaW50IHNvIG1heSBiZSByZW1vdmVkIGluIHRoZSBzZWNvbmQgd2F2ZSAod2F2ZTAxKS4KCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KCmJldHRlcl9peCA8LSAxOm5yb3coWF9iZXR0ZXJfYWcpCgpiZXR0ZXJfY29scyA8LSBjKHJlcCh3YXZlMDBjb2wsIGxlbmd0aChiZXR0ZXJfaXhfYWdfcm1zZSkpLCByZXAod2F2ZTAxY29sLGxlbmd0aChiZXR0ZXJfaXhfYWcwMV9ybXNlKSkpCgpwYWlycyhYX2JldHRlcl9hZywKICAgICAgY29sID0gYmV0dGVyX2NvbHMsCiAgICAgIGdhcCA9IDAsCiAgICAgIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBjaCA9IDE5LAogICAgICBjZXg9IDAuOCwKICAgICAgbG93ZXIucGFuZWwgPSBOVUxMKQoKCgpgYGAKCiMjIEJ1aWxkIGVtdWxhdG9ycyBhbmQgZmluZCBwYXJ0cyBvZiBwYXJhbWV0ZXIgc3BhY2UgdGhhdCB0byBiZXR0ZXIgdGhhbiBzdGFuZGFyZCBhdCBhdG1vc3BoZXJpYyBncm93dGguCgpIYXZpbmcgdHJvdWJsZSBmaXR0aW5nIFJNU0UsIHRvIHRyeWluZyBtZWFuIGVycm9yLgoKV2h5IGlzIHRoZXJlIGFuIG9kZCBjb2xsZWN0aW9uIGF0IGp1c3QgdW5kZXIgMT8KCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQojIHRoZXJlIGFyZSAxMDAgd2F2ZTAxIGVuc2VtYmxlIG1lbWJlcnMgdGhhdCBwYXNzIHRoZSBsZXZlbCAyIGNvbnN0cmFpbnN0Cmxlbmd0aChsZXZlbDJfaXhfd2F2ZTAxKQoKYmV0dGVyX2l4X2FnX21lIDwtIHdoaWNoKGFicyhhZ19tb2Rlcm5fbWUpIDwgYWJzKGFnX21vZGVybl9tZV9zdGFuKSkKCiMgVGhlcmUgYXJlIDEwNCB0aGF0IGhhdmUgYSBzbWFsbGVyIG1lYW4gZXJyb3IgdGhhbiBzdGFuZGFyZApiZXR0ZXJfaXhfYWcwMV9tZSA8LSB3aGljaChhYnMoYWcwMV9tb2Rlcm5fbWUpIDwgYWJzKGFnX21vZGVybl9tZV9zdGFuKSkKCiMgVGhlcmUgYXJlIG9ubHkgNDEgdGhhdCBwYXNzIGxldmVsIDIgQU5EIGhhdmUgc21hbGxlciBlcnJvciB0aGFuIHN0YW5kYXJkCmxldmVsMl9hbmRfYmV0dGVyX2FnMDFfaXggPC0gaW50ZXJzZWN0KGxldmVsMl9peF93YXZlMDEsIGJldHRlcl9peF9hZzAxX21lKQoKYGBgCgpUaGlzIG5leHQgcGFpcnMgcGxvdCBsb29rcyBhdCBhbGwgdGhlIGVuc2VtYmxlIG1lbWJlcnMgdGhhdCBoYXZlIGEgYmV0dGVyIG1lYW4gYXRtb3NwaGVyaWMgZ3Jvd3RoIGVycm9yIHRoYW4gc3RhbmRhcmQuCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KWF9iZXR0ZXJfYWcgPC0gcmJpbmQoWFtiZXR0ZXJfaXhfYWdfbWUsIF0sIFhfd2F2ZTAxX3RyYWluW2JldHRlcl9peF9hZzAxX21lLCBdKQoKYmV0dGVyX2l4IDwtIDE6bnJvdyhYX2JldHRlcl9hZykKCmJldHRlcl9jb2xzIDwtIGMobWFrZVRyYW5zcGFyZW50KHJlcCh3YXZlMDBjb2wsIGxlbmd0aChiZXR0ZXJfaXhfYWdfbWUpKSwgMTAwKSwgbWFrZVRyYW5zcGFyZW50KHJlcCh3YXZlMDFjb2wsbGVuZ3RoKGJldHRlcl9peF9hZzAxX21lKSksIDEwMCkpCgpwYWlycyhYX2JldHRlcl9hZywKICAgICAgY29sID0gYmV0dGVyX2NvbHMsCiAgICAgIGdhcCA9IDAsCiAgICAgIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBjaCA9IDE5LAogICAgICBjZXg9IDAuOCwKICAgICAgbG93ZXIucGFuZWwgPSBOVUxMKQpgYGAKClRoaXMgbmV4dCBwbG90IGxvb2tzIGF0IGFsbCB0aGUgZW5zZW1ibGUgbWVtYmVycyB0aGF0IGhhdmUgYSBiZXR0ZXIgbWVhbiBhdG1vc3BoZXJpYyBncm93dGggZXJyb3IgdGhhbiBzdGFuZGFyZCBBTkQgcGFzcyB0aGUgbGV2ZWwgMiBjb25zdHJhaW50cy4gIAoKVGhlIG51bWJlciBpcyBzbWFsbCAoNDEvMzAwKSwgYnV0IHRoZSBlbnNlbWJsZSBtZW1iZXJzIHNlZW0gc3ByZWFkIGFjcm9zcyBwYXJhbWV0ZXIgc3BhY2UuCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KClhfbGV2ZWwyX2FuZF9iZXR0ZXJfYWcwMSA8LSBYW2xldmVsMl9hbmRfYmV0dGVyX2FnMDFfaXgsIF0KcGFpcnMoWF9sZXZlbDJfYW5kX2JldHRlcl9hZzAxLAogICAgICBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ2JsYWNrJywgMTUwKSwKICAgICAgZ2FwID0gMCwKICAgICAgeGxpbSA9IGMoMCwxKSwgeWxpbSA9IGMoMCwxKSwKICAgICAgcGNoID0gMTksCiAgICAgIGNleD0gMC44LAogICAgICBsb3dlci5wYW5lbCA9IE5VTEwpCgpgYGAKCgoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeShEaWNlS3JpZ2luZykKCmFnMDFfb3V0bGllcl9peCA8LSB3aGljaChhZzAxX21vZGVybl9tZSA+IDEwKQoKZml0X2FnX21lIDwtIGttKH4uLCBkZXNpZ24gPSBYX3dhdmUwMV90cmFpblstYWcwMV9vdXRsaWVyX2l4LCBdLCByZXNwb25zZSA9IGFnMDFfbW9kZXJuX21lWy1hZzAxX291dGxpZXJfaXhdLCAKICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QobWF4aXQgPSAyMDApKQoKYGBgCgpgYGB7cn0KCnBsb3QoZml0X2FnX21lKQoKCgoKYGBgCgpgYGB7cn0KbGlicmFyeShlbXRvb2xzKQpsaWJyYXJ5KGltcHRvb2xzKQpsaWJyYXJ5KHZpenRvb2xzKQoKbnVuaWYgPC0gMTAwMDAwClhfdW5pZiA8LSBzYW1wX3VuaWYobnVuaWYsIG1pbnMgPSByZXAoMCwzMiksIG1heGVzID0gcmVwKDEsIDMyKSkKY29sbmFtZXMoWF91bmlmKSA8LSBjb2xuYW1lcyhYKQoKcHJlZF91bmlmX2FnIDwtIHByZWRpY3Qua20oZml0X2FnX21lLCBuZXdkYXRhID0gWF91bmlmLCB0eXBlID0gJ1VLJyApIAoKIyBLZWVwcyBhYm91dCAyMCUKWF9rZXB0X2l4IDwtIHdoaWNoKGFicyhwcmVkX3VuaWZfYWckbWVhbikgPCBhYnMoYWdfbW9kZXJuX21lX3N0YW4pKQoKCihsZW5ndGgoWF9rZXB0X2l4KSAvIG51bmlmKSAqIDEwMAojIHRoaXMgaXMgOCUKI1hfa2VwdF9peCA8LSB3aGljaChhYnMocHJlZF91bmlmJG1lYW4pIDwgMC4xKQoKCmBgYAoKCiMjIElucHV0IHNwYWNlIHdpdGggbG93IEF0bW9zcGhlcmljIEdyb3d0aCBFcnJvcgpUaGlzIHBhaXJzIHBsb3Qgc2hvd3MgdGhlIDJkIGFuZCBtYXJnaW5hbCBkZW5zaXR5IG9mIGVtdWxhdGVkIGlucHV0IHBvaW50cyB3aGVyZSB0aGUgZW11bGF0ZWQgYXRtb3NwaGVyaWMgZ3Jvd3RoIGlzIGNsb3NlciB0byB0aGUgb2JzZXJ2YXRpb25zIHRoYW4gdGhlIHN0YW5kYXJkIG1vZGVsLgoKVGhpcyB0ZWNobmlxdWUgbWlnaHQgcHJvdmlkZSBhIHVzZWZ1bCBzZXQgb2YgcG9pbnRzIGZvciBvcHRpbWlzaW5nIHRoZSBtb2RlbCAoYXQgbGVhc3QgdG8gYXRtb3NwaGVyaWMgZ3Jvd3RoKS4KCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyLCB3YXJuaW5nID0gRkFMU0V9CiNwYWlycyhYX3VuaWZbWF9rZXB0X2l4LCBdWzE6NTAsXSwKIyAgICAgIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnYmxhY2snLDUwKSwKIyAgICAgIGdhcCA9IDAsCiMgICAgICB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAojICAgICAgcGNoID0gMTksCiMgICAgICBjZXg9IDAuOCwKIyAgICAgIGxvd2VyLnBhbmVsID0gTlVMTCkKCnBhcihvbWEgPSBjKDAsMCwwLDMpLCBiZyA9ICd3aGl0ZScpCgoKcGFuZWwuaGlzdCA9IGZ1bmN0aW9uKHgsIC4uLikgewogIHVzciA9IHBhcigidXNyIik7IG9uLmV4aXQocGFyKHVzcikpCiAgcGFyKHVzciA9IGModXNyWzE6Ml0sIDAsIDEuNSkpCiAgaGlzdCh4LCBmcmVxID0gRkFMU0UsIGNvbD0iY3lhbiIsIGFkZD1UUlVFKSAKICBsaW5lcyhkZW5zaXR5KHgpKQp9CgpwYWlycyhYX3VuaWZbWF9rZXB0X2l4LCBdLAogICAgIyAgbGFiZWxzID0gMTpkLAogICAgICBnYXAgPSAwLCBsb3dlci5wYW5lbCA9IE5VTEwsIHhsaW0gPSBjKDAsMSksIHlsaW0gPSBjKDAsMSksCiAgICAgIHBhbmVsID0gZGZ1bmNfdXAsCiAgICAgIGRpYWcucGFuZWwgPSBwYW5lbC5oaXN0LAogICAgICBjZXgubGFiZWxzID0gMSwKICAgICAgY29sLmF4aXMgPSAnd2hpdGUnLAogICAgICBkZnVuY19jb2wgPSByYikKCmBgYAoKTmV4dCwgY2hlY2sgZW11bGF0b3JzIG9mIGFsbCB0aGUgb3RoZXIgb3V0cHV0cyBhbmQgYXBwbHkgdGhlIGNvbnN0cmFpbnRzIHRvIHRoZW0uIFNlZSBob3cgdGhlIGNvbnN0cmFpbnRzIGNoYW5nZS4KCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQoKCiMgRmlyc3QsIHRyeSB0aGUgZW11bGF0b3JzIGJ1aWx0IHVzaW5nIGp1c3Qgd2F2ZTAxCiNmaXRfbGlzdF9jb25zdF9sZXZlbDFhCgoKWV9jb25zdF9wcmVkX3VuaWZfbWVhbiA8LSBtYXRyaXgoTkEsIG5jb2wgPSBuY29sKFlfY29uc3RfbGV2ZWwxYV9zY2FsZWQpLCBucm93ID0gbnJvdyhYX3VuaWYpKQpjb2xuYW1lcyhZX2NvbnN0X3ByZWRfdW5pZl9tZWFuKSA8LSBjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKQoKWV9jb25zdF9wcmVkX3VuaWZfc2QgPC0gbWF0cml4KE5BLCBuY29sID0gbmNvbChZX2NvbnN0X2xldmVsMWFfc2NhbGVkKSwgbnJvdyA9IG5yb3coWF91bmlmKSkgCmNvbG5hbWVzKFlfY29uc3RfcHJlZF91bmlmX3NkKSA8LSBjb2xuYW1lcyhZX2NvbnN0X2xldmVsMWFfc2NhbGVkKQoKZm9yKGkgaW4gMTpsZW5ndGgoZml0X2xpc3RfY29uc3RfbGV2ZWwxYSkpewogIAogIHByZWRfdW5pZiA8LSBwcmVkaWN0LmttKG9iamVjdD1maXRfbGlzdF9jb25zdF9sZXZlbDFhW1tpXV0sIG5ld2RhdGEgPSBYX3VuaWYsIHR5cGUgPSAnVUsnKQogIAogIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLGkgXSA8LSBwcmVkX3VuaWYkbWVhbgogIFlfY29uc3RfcHJlZF91bmlmX3NkWyxpIF0gPC0gcHJlZF91bmlmJHNkCn0KCgpgYGAKCiMjIElucHV0IHNwYWNlIHdpdGggZW11bGF0ZWQgbWVtYmVycyBwYXNzaW5nIExldmVsIDIgY29uc3RyYWludHMuCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMiwgd2FybmluZyA9IEZBTFNFfQoKbGV2ZWwyX2l4X2VtIDwtIHdoaWNoKFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCduYnBfbG5kX3N1bSddID4gMCAmCiAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ25wcF9ubGltX2xuZF9zdW0nXSA+IDM1ICYgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ25wcF9ubGltX2xuZF9zdW0nXSA8IDgwICYKICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnY1NvaWxfbG5kX3N1bSddID4gNzUwICYgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NTb2lsX2xuZF9zdW0nXSA8IDMwMDAgJgogICAgICAgICAgICAgICAgICBZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnY1ZlZ19sbmRfc3VtJ10gPiAzMDAgJiBZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnY1ZlZ19sbmRfc3VtJ10gPCA4MDAKICAgICAgICAgICAgICAgICAgKQoKcGFpcnMoWF91bmlmW2xldmVsMl9peF9lbSwgXSwKICAgICMgIGxhYmVscyA9IDE6ZCwKICAgICAgZ2FwID0gMCwgbG93ZXIucGFuZWwgPSBOVUxMLCB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAogICAgICBwYW5lbCA9IGRmdW5jX3VwLAogICAgICBkaWFnLnBhbmVsID0gcGFuZWwuaGlzdCwKICAgICAgY2V4LmxhYmVscyA9IDEsCiAgICAgIGNvbC5heGlzID0gJ3doaXRlJywKICAgICAgZGZ1bmNfY29sID0gcmIpCgoobGVuZ3RoKGxldmVsMl9peF9lbSkgLyBudW5pZikgKiAxMDAKYGBgCgojIyBJbnB1dCBzcGFjZSB3aXRoIGVtdWxhdGVkIG1lbWJlcnMgcGFzc2luZyBMZXZlbCAyIGNvbnN0cmFpbnRzIEFORCBsb3cgYXRtb3NwaGVyaWMgZ3Jvd3RoIGVycm9yCkVtdWxhdGVkIG1lbWJlcnMgcGFzc2luZyBsZXZlbDIgY29uc3RyYWludHMgQU5EIGhhdmluZyBsb3dlciBlcnJvciBpbiBhdG1vc3BoZXJpYyBncm93dGggdGhhbiBzdGFuZGFyZC4gCgpSZWQgcG9pbnQgaW5kaWNhdGVzIHRoZSBzdGFuZGFyZCBpbnB1dC4KClRoZSBwb3NpdGlvbiBvZiB0aGUgc3RhbmRhcmQgaW5wdXQgd2l0aCByZWdhcmRzIHRvIHRoZSBoaXN0b2dyYW1zIGdpdmUgdXMgYW4gaWRlYSBvZiB3aGF0IHdlIG1pZ2h0IGRvIHRvIGltcHJvdmUgdGhlIHNpbXVsYXRpb24gLSBhdCBsZWFzdCBpbiB0ZXJtcyBvZiBhdG1vc3BoZXJpYyBncm93dGguIElmIHdlIHdlcmUgdG8gbW92ZSB0aGUgaW5wdXQgdG93YXJkcyBhcmVhcyBvZiBoaWdoZXIgZGVuc2l0eSwgd2UgbWlnaHQgZXhwZWN0IGEgYmV0dGVyIG1vZGVsIHBlcmZvcm1hbmNlLgoKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyLCB3YXJuaW5nID0gRkFMU0V9CgpYX3N0YW5fbm9ybSA8LSBub3JtYWxpemUobWF0cml4KHJlcCgxLCAzMiksIG5yb3cgPSAxKSwgd3J0ID0gbGhzKQoKbGV2ZWwyX2FuZF9hZ19peF9lbSA8LSB3aGljaChZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnbmJwX2xuZF9zdW0nXSA+IDAgJgogICAgICAgICAgICAgICAgICAgIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCducHBfbmxpbV9sbmRfc3VtJ10gPiAzNSAmIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCducHBfbmxpbV9sbmRfc3VtJ10gPCA4MCAmCiAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NTb2lsX2xuZF9zdW0nXSA+IDc1MCAmIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCdjU29pbF9sbmRfc3VtJ10gPCAzMDAwICYKICAgICAgICAgICAgICAgICAgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NWZWdfbG5kX3N1bSddID4gMzAwICYgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NWZWdfbG5kX3N1bSddIDwgODAwICYKICAgICAgICAgICAgICAgICAgICBhYnMocHJlZF91bmlmX2FnJG1lYW4pIDwgYWJzKGFnX21vZGVybl9tZV9zdGFuKQogICAgICAgICAgICAgICAgICApCgoKCnBhaXJzKHJiaW5kKFhfdW5pZltsZXZlbDJfYW5kX2FnX2l4X2VtLCBdLCBYX3N0YW5fbm9ybSksCiAgICAjICBsYWJlbHMgPSAxOmQsCiAgICAgIGdhcCA9IDAsIGxvd2VyLnBhbmVsID0gTlVMTCwgeGxpbSA9IGMoMCwxKSwgeWxpbSA9IGMoMCwxKSwKICAgICAgcGFuZWwgPSBkZnVuY191cF90cnV0aCwKICAgICAgZGlhZy5wYW5lbCA9IHBhbmVsLmhpc3QsCiAgICAgIGNleC5sYWJlbHMgPSAxLAogICAgICBjb2wuYXhpcyA9ICd3aGl0ZScsCiAgICAgIGRmdW5jX2NvbCA9IHJiKQoKCihsZW5ndGgobGV2ZWwyX2FuZF9hZ19peF9lbSkgLyBudW5pZikgKiAxMDAKYGBgCiMgRXhwbG9yaW5nIGZ1cnRoZXIgY29uc3RyYWludHMKCkl0J3MgcHJldHR5IGNsZWFyIHRoYXQgdGhlICJpbml0aWFsIiAobGV2ZWwyKSBjb25zdHJhaW50cyBjYW4gYmUgaW1wcm92ZWQgb24uIEhvdyBhYm91dCB0cmVlLCBzaHJ1YiBhbmQgYmFyZSBzb2lsIGZyYWN0aW9ucz8KCkJ1aWxkIGFuIGVuc2VtYmxlIG9mIG1vZGVybiB2ZWdldGF0aW9uIGZyYWN0aW9ucy4KYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0KCiMgbnN0YXJ0IDwtIDQ5OQojIG5lbmQgPC0gNzk4CgojaWYgKGZpbGUuZXhpc3RzKCJlbnNlbWJsZV93YXZlMDEucmRhdGEiKSkgewojICBsb2FkKCJlbnNlbWJsZV93YXZlMDEucmRhdGEiKQojfSBlbHNlIHsKeV9uYW1lc19mcmFjX21lYW4gPC0gYygndHJlZUZyYWNfbG5kX21lYW4nLCAnYzNQZnRGcmFjX2xuZF9tZWFuJywgJ2M0UGZ0RnJhY19sbmRfbWVhbicsICdzaHJ1YkZyYWNfbG5kX21lYW4nLCAnYmFyZXNvaWxGcmFjX2xuZF9tZWFuJykKICAKZW5zX3dhdmUwMV9mcmFjX21lYW5fbXYgPC0gbWFrZUp1bGVzRW5zZW1ibGVNb2Rlcm5WYWx1ZShlbnNsb2MgPSAnL3NjcmF0Y2gvaGFkYXcvanVsZXNfcG9zdHByb2Nlc3MvdS1jazAwNi8nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmxpc3QgPSB5X25hbWVzX2ZyYWNfbWVhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zdGFydCA9IG5zdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lbmQgPSBuZW5kLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl4ID0gMTQ0OjE2NCkgCiAgCiMgIHNhdmUoZW5zX3dhdmUwMV9tdiwgZmlsZSA9ImVuc2VtYmxlX3dhdmUwMS5yZGF0YSIpCiN9CgoKYGBgCgoKYGBge3J9CiMgV2hhdCBpZiB3ZSBhbHNvIGhhZCBhICJ0b2xlcmFuY2UgdG8gZXJyb3IiIHRoYXQgbG9va2VkIGxpa2UgdGhpcy4gQmFzaWNhbGx5IG1ha2luZyB1cCBmb3IgdGhlIGZhY3Qgd2UgaGF2ZW4ndCBnb3QgInN0cm9uZyIgb2JzZXJ2YXRpb25zIG9mIGZyYWN0aW9ucywgYnV0IG1pZ2h0IGhhdmUgYSB0b2xlcmFuY2UgdG8gZXJyb3Igb2Ygc29tZSBvZiB0aGVzZSBwcm9wZXJ0aWVzLiBUaGV5IHdvdWxkIGF0IGxlYXN0IGFsbG93IHVzIHRvIGlkZW50aWZ5IHRyYWRlLW9mZnMuCgojIHRyZWVmcmFjIDIwLSA0MAoKIyBzaHJ1YmZyYWMgPCA1CgojIGJhcmVzb2lsIDwgNDAKCiNkZXNpZ24gPSBYX3dhdmUwMV90cmFpblstYWcwMV9vdXRsaWVyX2l4LCBdLAoKYGBgCgpgYGB7cn0KcGFyKG1mcm93ID0gYygyLDMpKQojIGJpbmQgZW5zZW1ibGUgMCAobGV2ZWwgMWEpIGFuZCB3YXZlMDEgZnJhY3Rpb25zCllfZnJhY19sZXZlbDFhX3dhdmUwMSA8LSByYmluZChZX2xldmVsMWFbLCB5X25hbWVzX2ZyYWNfbWVhbl0sIGVuc193YXZlMDFfZnJhY19tZWFuX212JGRhdG1hdCApWy00NDAsIF0KCgpmb3IoaSBpbiAxOm5jb2woWV9mcmFjX2xldmVsMWFfd2F2ZTAxKSkKewogIAogIGhpc3QoWV9mcmFjX2xldmVsMWFfd2F2ZTAxWzE6bnJvdyhZX2xldmVsMWEpLGldLCBtYWluID0gY29sbmFtZXMoWV9mcmFjX2xldmVsMWFfd2F2ZTAxKVtpXSwgeGxhYiA9ICcnKQogIGhpc3QoWV9mcmFjX2xldmVsMWFfd2F2ZTAxWyhucm93KFlfbGV2ZWwxYSkrMSkgOiBucm93KFlfZnJhY19sZXZlbDFhX3dhdmUwMSksIGldLCAgYWRkID0gVFJVRSwgY29sID0gJ2dyZXknKQogIAp9CmBgYAoKCgoKYGBge3J9CiMgQ3JlYXRlIGZpdCBsaXN0cyBmb3IgdGhlIGNvbWJpbmVkIGRhdGEKWV9mcmFjX2xldmVsMWFfd2F2ZTAxX2xpc3QgPC0gbWF0Mmxpc3QoWV9mcmFjX2xldmVsMWFfd2F2ZTAxKQoKZml0X2xpc3RfZnJhY19sZXZlbDFhX3dhdmUwMSA8LSBtY2xhcHBseShYID0gWV9mcmFjX2xldmVsMWFfd2F2ZTAxX2xpc3QsIEZVTiA9IGttLCBmb3JtdWxhID0gfi4sIGRlc2lnbiA9IFhfbGV2ZWwxYV93YXZlMDFbLTQ0MCxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jLmNvcmVzID0gNCwgY29udHJvbCA9IGxpc3QodHJhY2UgPSBGQUxTRSkpCgoKYGBgCgoKYGBge3J9CgoKCmZvcihpIGluIDE6bGVuZ3RoKGZpdF9saXN0X2ZyYWNfbGV2ZWwxYV93YXZlMDEpKQogIAogIHBsb3QoZml0X2xpc3RfZnJhY19sZXZlbDFhX3dhdmUwMVtbaV1dKQoKCmBgYAoKIyMgTGVhdmUtb25lLW91dCBhbmFseXNlcyBvZiBlbXVsYXRvciBwcmVkaWN0aW9uIGFjY3VyYWN5CgpgYGB7cn0KCmxvb2xpc3Rfa21fWV9mcmFjX2xldmVsMWFfd2F2ZTAxIDwtIG1jbGFwcGx5KFggPSBmaXRfbGlzdF9mcmFjX2xldmVsMWFfd2F2ZTAxLCBGVU4gPSBsZWF2ZU9uZU91dC5rbSwgdHlwZSA9ICdVSycsIHRyZW5kLnJlZXN0aW0gPSBUUlVFKQoKYGBgCgoKCmBgYHtyfQoKCllfZnJhY19wcmVkX3VuaWZfbWVhbiA8LSBtYXRyaXgoTkEsIG5jb2wgPSBuY29sKFlfZnJhY19sZXZlbDFhX3dhdmUwMSksIG5yb3cgPSBucm93KFhfdW5pZikpCmNvbG5hbWVzKFlfZnJhY19wcmVkX3VuaWZfbWVhbikgPC0gY29sbmFtZXMoWV9mcmFjX2xldmVsMWFfd2F2ZTAxKQoKWV9mcmFjX3ByZWRfdW5pZl9zZCA8LSBtYXRyaXgoTkEsIG5jb2wgPSBuY29sKFlfZnJhY19sZXZlbDFhX3dhdmUwMSksIG5yb3cgPSBucm93KFhfdW5pZikpIApjb2xuYW1lcyhZX2ZyYWNfcHJlZF91bmlmX3NkKSA8LSBjb2xuYW1lcyhZX2ZyYWNfbGV2ZWwxYV93YXZlMDEpCgpmb3IoaSBpbiAxOmxlbmd0aChmaXRfbGlzdF9mcmFjX2xldmVsMWFfd2F2ZTAxKSl7CiAgCiAgcHJlZF91bmlmIDwtIHByZWRpY3Qua20ob2JqZWN0ID0gZml0X2xpc3RfZnJhY19sZXZlbDFhX3dhdmUwMVtbaV1dLCBuZXdkYXRhID0gWF91bmlmLCB0eXBlID0gJ1VLJykKICAKICBZX2ZyYWNfcHJlZF91bmlmX21lYW5bLGkgXSA8LSBwcmVkX3VuaWYkbWVhbgogIFlfZnJhY19wcmVkX3VuaWZfc2RbLGkgXSA8LSBwcmVkX3VuaWYkc2QKfQoKCgpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGVycm9yID0gRkFMU0UgfQoKCgpsZXZlbDJfYW5kX2FnX2FuZF9mcmFjX2l4X2VtIDwtIHdoaWNoKFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCduYnBfbG5kX3N1bSddID4gMCAmCiAgICAgICAgICAgICAgICAgICAgICBZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnbnBwX25saW1fbG5kX3N1bSddID4gMzUgJiBZX2NvbnN0X3ByZWRfdW5pZl9tZWFuWywnbnBwX25saW1fbG5kX3N1bSddIDwgODAgJgogICAgICAgICAgICAgICAgICAgICAgWV9jb25zdF9wcmVkX3VuaWZfbWVhblssJ2NTb2lsX2xuZF9zdW0nXSA+IDc1MCAmIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCdjU29pbF9sbmRfc3VtJ10gPCAzMDAwICYKICAgICAgICAgICAgICAgICAgICAgIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCdjVmVnX2xuZF9zdW0nXSA+IDMwMCAmIFlfY29uc3RfcHJlZF91bmlmX21lYW5bLCdjVmVnX2xuZF9zdW0nXSA8IDgwMCAmCiAgICAgICAgICAgICAgICAgICAgICBhYnMocHJlZF91bmlmX2FnJG1lYW4pIDwgYWJzKGFnX21vZGVybl9tZV9zdGFuKQogICAgICAgICAgICAgICAgICApCgoKCnBhaXJzKHJiaW5kKFhfdW5pZltsZXZlbDJfYW5kX2FnX2l4X2VtLCBdLCBYX3N0YW5fbm9ybSksCiAgICAjICBsYWJlbHMgPSAxOmQsCiAgICAgIGdhcCA9IDAsIGxvd2VyLnBhbmVsID0gTlVMTCwgeGxpbSA9IGMoMCwxKSwgeWxpbSA9IGMoMCwxKSwKICAgICAgcGFuZWwgPSBkZnVuY191cF90cnV0aCwKICAgICAgZGlhZy5wYW5lbCA9IHBhbmVsLmhpc3QsCiAgICAgIGNleC5sYWJlbHMgPSAxLAogICAgICBjb2wuYXhpcyA9ICd3aGl0ZScsCiAgICAgIGRmdW5jX2NvbCA9IHJiKQoKCihsZW5ndGgobGV2ZWwyX2FuZF9hZ19peF9lbSkgLyBudW5pZikgKiAxMDAKCihsZW5ndGgobGV2ZWwyX2FuZF9hZ19hbmRfZnJhY19peF9lbSkgLyBudW5pZikgKiAxMDAKCgpgYGAKCgoKCgo=